【问题标题】:Does java.util.List.isEmpty() check if the list itself is null? [duplicate]java.util.List.isEmpty() 是否检查列表本身是否为空? [复制]
【发布时间】:2012-07-15 18:09:41
【问题描述】:

java.util.List.isEmpty() 是否检查列表本身是否为null,还是我必须自己检查?

例如:

List<String> test = null;

if (!test.isEmpty()) {
    for (String o : test) {
        // do stuff here            
    }
}

这会抛出一个NullPointerException,因为测试是null吗?

【问题讨论】:

  • 不能。 NPE 在被调用之前会被抛出。
  • 这(“这是否会抛出 NullPointerException,因为 test 为空?”)实际上是一个非常错误的问题。您可以通过一个非常简单的测试轻松测试这个问题。问题本身当然需要考虑更深入地了解 Java 中的引用是如何工作的,为什么 Java 设计成这样是不可能的,但是你应该问不同的问题。

标签: java list


【解决方案1】:

在任何空引用上调用任何方法总是会导致异常。先测试对象是否为null:

List<Object> test = null;
if (test != null && !test.isEmpty()) {
    // ...
}

或者,写一个方法来封装这个逻辑:

public static <T> boolean IsNullOrEmpty(Collection<T> list) {
    return list == null || list.isEmpty();
}

那么你可以这样做:

List<Object> test = null;
if (!IsNullOrEmpty(test)) {
    // ...
}

【讨论】:

  • “java.util.List.isEmpty() 是否检查列表本身是否为空?” 对我来说似乎很清楚——他问的是列表,而不是其内容。
  • 是的,他用这么奇怪的问题完全把我弄糊涂了。我的意思是,另一种方式也很愚蠢,因为检查是针对if(!empty) then iterate...但是我在看到您的答案之前删除了我的愚蠢评论。也许他来自 PHP,我们有 !empty($foo) 作为 isset($foo) &amp;&amp; $foo != "" 的别名。
【解决方案2】:

是的,它会抛出异常。也许你习惯了 PHP 代码,empty($element) 也会检查isset($element)?在 Java 中,情况并非如此。

你可以很容易地记住这一点,因为该方法是直接在列表上调用的(该方法属于列表)。因此,如果没有列表,那么就没有方法。 Java 会抱怨没有可以调用此方法的列表。

【讨论】:

    【解决方案3】:

    抛出一个NullPointerException - 任何尝试在null 引用上调用实例方法的尝试一样 - 但在这种情况下,您应该对null 进行显式检查:

    if ((test != null) && !test.isEmpty())
    

    这比传播Exception 更好、更清晰。

    【讨论】:

    • 对于列表,我有时会使用: if ( eList != null && eList.size() > 0 )
    【解决方案4】:

    您正尝试在 null 引用(如 List test = null; )上调用 isEmpty() 方法。这肯定会引发NullPointerException。你应该改用if(test!=null)(首先检查null)。

    如果ArrayList 对象不包含任何元素,则isEmpty() 方法返回true;否则为 false(因为必须首先实例化 List,在您的情况下是 null)。

    编辑:

    您可能希望看到this 的问题。

    【讨论】:

      【解决方案5】:

      我会推荐使用 Apache Commons Collections

      http://commons.apache.org/proper/commons-collections/javadocs/api-release/org/apache/commons/collections4/CollectionUtils.html#isEmpty(java.util.Collection)

      它的实现非常好并且有据可查:

      /**
       * Null-safe check if the specified collection is empty.
       * <p>
       * Null returns true.
       * 
       * @param coll  the collection to check, may be null
       * @return true if empty or null
       * @since Commons Collections 3.2
       */
      public static boolean isEmpty(Collection coll) {
          return (coll == null || coll.isEmpty());
      }
      

      【讨论】:

      • Apache Utils 非常棒!最近我发现了 SpringUtils.join - 在集合上使用非常有用。抱歉有点离题:)
      【解决方案6】:

      除了狮子的回答我可以说你最好使用if(CollectionUtils.isNotEmpty(test)){...} 这也会检查 null,因此不需要手动检查。

      【讨论】:

        【解决方案7】:

        java.util.List.isEmpty() 检查列表是否为 null

        如果您使用 Spring 框架,您可以使用 CollectionUtils 类来检查列表是否为空。它还负责处理 null 引用。以下是 Spring 框架的 CollectionUtils 类中的代码 sn-p。

        public static boolean isEmpty(Collection<?> collection) {
            return (collection == null || collection.isEmpty());
        }
        

        即使您不使用 Spring,您也可以继续调整此代码以添加到您的 AppUtil 类中。

        【讨论】:

          【解决方案8】:

          您也可以使用自己的 isEmpty(用于多个集合)方法。将此添加到您的 Util 类。

          public static boolean isEmpty(Collection... collections) {
              for (Collection collection : collections) {
                  if (null == collection || collection.isEmpty())
                      return true;
              }
              return false;
          }
          

          【讨论】:

          • 也许你应该把它重命名为areEmpty()?我发现这样的方法/功能更难使用,因为它们会让一些东西漏掉。此外,如果第一个 Collection 为 null 或为空,而其余的都不是,则会出现意外行为。
          猜你喜欢
          • 2012-06-17
          • 1970-01-01
          • 1970-01-01
          • 2010-12-16
          • 2016-03-24
          • 1970-01-01
          • 1970-01-01
          • 2012-12-18
          • 1970-01-01
          相关资源
          最近更新 更多