如何测试 List<String> 是否为空或为 null?

6

无论我做什么,结果总是错误的。

我的列表定义如下:

private List<String> selectedPriorities;

在 getter/setter 上没有任何奇怪或花哨的东西:

public void setSelectedPriorities(List<String> selectedPriorities) {
    this.selectedPriorities = selectedPriorities;
}

public List<String> getSelectedPriorities() {
    return selectedPriorities;
}

在一个会话bean中,我想基于这个列表的内容(或者缺少内容)来修改不同的列表。
以下是代码:
List<String> restrictList = new ArrayList<String>();
restrictList.add("lower(logs.clazz) like lower(concat(#{logs.clazz},'%'))");
restrictList.add("lower(logs.rule) like lower(concat(#{logs.rule},'%'))");
PrioritySelectorBean selectorBean = (PrioritySelectorBean) Component.getInstance("prioritySelectorBean",true);
System.out.println("constructRestrictionList selectorBean "+selectorBean.getSelectedPriorities());

if (selectorBean.getSelectedPriorities() == null) {
    System.out.println("IS NULL");
    return restrictList;
}

if (selectorBean.getSelectedPriorities().isEmpty()){
    System.out.println("IS EMPTY");
}

if (selectorBean.getSelectedPriorities().size()<1){
    System.out.println("HAS NOTHING IN IT");
    return restrictList;
}
System.out.println("NOT NULL");
restrictList.add("lower(logs.priority) in (#{prioritySelectorBean.selectedPriorities})");

它总是落到NOT NULL上,并将字符串添加到restrictList中。这让我疯了!我该如何检测这个列表中的空值?以下是日志片段:

14:24:10,057 INFO  [STDOUT] constructRestrictionList selectorBean []
14:24:10,057 INFO  [STDOUT] NOT NULL

我不太确定,但是可以使用equals()来代替==,我认为有一个这样命名的方法。如果我错了,请删除这条评论。 - Carlos Valenzuela
1
看起来你这里真的有一个非空列表 :) size() 返回什么?.get(0) 返回了什么? - kostja
1
@Chuck Birkin:在这里,val == null 是完全可以的。最好不要在对象为空时调用方法 ;) - kostja
我尝试打印size(),但是出现了NullPointerException。不要问我为什么在测试size()<1时没有得到这个错误?而且它必须是一个非空列表。 - april26
2个回答

15
如果列表中只包含一个空字符串,则您将看到您正在查看的结果。
List<String> list = new ArrayList<String>();
list.add("");

System.out.println("blah = " + list);  // displays "blah = []"
if (list.isEmpty()) {
    System.out.println("Empty"); // doesn't get displayed
}

抢先一步了。这似乎是最有可能的。 - ColinD
我同意,但是size()不会返回任何东西吗?当我尝试打印size()时,我得到了NPE。请参见上面的评论。 - april26
@april:如果没有看到一些可编译的代码来重现问题,我就不知道该怎么办! - Oliver Charlesworth
@april26:你发布的代码没有抛出NPE,但尝试打印size()却出现了异常,这毫无意义。这应该是不可能的(假设你将打印调用放在同一段代码中)。显然有些我们看不到的问题,所以我认为我们无法帮助你。尝试发布一个小的、自包含的完整示例,也许我们可以运行它。 - ColinD
我现在确认列表中有1个元素。我对列表大小进行了3次测试,size()==0、size()==1、size()>1。由于某种原因,当我尝试打印.size()时,我得到了一个NPE。然而,当我测试.size()==1时,我得到了TRUE。感谢您的帮助。 - april26
显示剩余3条评论

-3

可能是因为

if (selectorBean.getSelectedPriorities().isEmpty()){
       System.out.println("IS EMPTY");   
} 

需要返回吗?


1
我也考虑过这个问题,但是日志会显示“为空”的行。 - Carlos Valenzuela
不确定——为什么 System.out.println("IS EMPTY") 没有被打印出来,而且为什么 selectorBean.getSelectedPriorities().size()<1 的结果不是 false? - dfb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接