检查数组是否为空,但不为null。

4

我有一个对象数组(Object[] array),我想检查它是否为空,但如果它为null,则快速失败并抛出NPE或任何其他异常。

我知道我可以进行以下检查:

array.length == 0

在例如String或集合的情况下,不建议使用.size().length()进行比较,甚至IntelliJ都有相应的检查:

报告任何使用0字面值进行比较的.size().length()可以替换为调用.isEmpty()

是否有针对数组的.isEmpty()的替代方案?

有一个ArrayUtils.html#isEmpty(java.lang.Object[]),但它也检查了null,而我想避免这种情况。


3
你可以简单地自己编写所需的方法。 - Jesper
java.lang.Object中的getLength()怎么样? - Serafins
@Jesper 在 SO 上提问肯定很有趣。 - wero
请使用 array.length == 0,忽略IntelliJ的无用提示,因为isEmpty()显然不能做你想要的事情。一定要先检查是否为null。 - Philipp Sander
@PhilippSander IntelliJ不会对数组发出警告,它会对字符串和集合发出警告,正如问题所述。 - Michal Kordas
显示剩余3条评论
2个回答

4
因为 .size() 是一个方法,其实现是被隐藏的。你无法确定该方法是否被优化(例如,一些集合可能在每次调用.size()方法时枚举项目)。这就是为什么计算集合的.size()可能很昂贵。与此同时,.isEmpty() 只能检查集合中是否至少有一个项目,并返回结果。
但是.length只是一个字段。它什么也不做,只返回一个值。没有计算。这个字段只存储具有固定大小的数组的长度。
我认为.size().length完全不同,在这种情况下,它们不能进行比较,以及集合和数组。

0
最简单的方法是自己编写这样一个方法。这将非常容易。可以像下面这样实现:
public boolean isArrayEmpty(Object[] array) {
    if (array == null) {
        //Throw nullpointer exception
        //An easy of method of doing this would be accessing any array field (for example: array.length)
    }
    return (ArrayUtils.isEmpty(array));
}

话虽如此,array.length == 0几乎没有什么害处。这是最简单、最干净的方法,可以完全满足您的需求。ArrayUtils.isEmpty的原因很可能是为了方便测试数组是否为空为null,这是一个相对常见的需求,但您不需要这样做。


为什么要抛出自己的NullPointerException?只需执行return array.length == 0。而ArrayUtils不是Java原生的。 - OneCricketeer
@cricket_007 这是一种做法。我不知道原帖作者想要做什么。但我会将其作为建议添加到答案中,作为可能的解决方法。感谢您的贡献! - DonyorM
返回 ArrayUtils.isEmpty(array) 是一个非常绕弯的方式,而 array.length == 0 则更为直接。我宁愿修复 IntelliJ 对好坏的理解,也不想使用 ArrayUtils 来完成这个任务。 - tucuxi

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