記錄一次空對象調用isEmpty()的經歷

記錄一次空對象調用isEmpty()的經歷

  在作項目的的時候,調用了一個前同事的接口,發如今他的實現類裏出現了一個問題:他使用了集合對象調用isEmpty()方法用來判斷集合是否爲空。這種作法初看一直看不出什麼問題,後來通過了小測試終於發現了問題。java

  先貼上代碼:ide

/**
* @author 拾萬個爲何
* @date 2021/3/30
* @since JDK1.8
*/
public class IsEmptyDemo {

public static void main(String[] args) {

Set s = new HashSet();
System.out.println(s.isEmpty());
}

}

  以上代碼輸出"true",再看下面的代碼,猜一猜輸出什麼:工具

/**
* @author 拾萬個爲何
* @date 2021/3/30
* @since JDK1.8
*/
public class IsEmptyDemo {

public static void main(String[] args) {

Set s = null;
System.out.println(s.isEmpty());
}

}

  沒錯,這是控制檯打印的:測試

Exception in thread "main" java.lang.NullPointerException
at IsEmptyDemo.main(IsEmptyDemo.java:14)

  一樣,下面的代碼打印的是結果是同樣的:code

/**
* @author 拾萬個爲何
* @date 2021/3/30
* @since JDK1.8
*/
public class IsEmptyDemo {

public static void main(String[] args) {

String s = null;
System.out.println(s.length());
}
}

  那麼,如何判斷空對象呢?能夠這樣:對象

/**
* @author 拾萬個爲何
* @date 2021/3/30
* @since JDK1.8
*/
public class IsEmptyDemo {

public static void main(String[] args) {

Set s = null;

if(s != null && s.size() != 0){
System.out.println(s.size());
}else{
System.out.println("s is null");
}
}
}

  或者,使用hutool這個工具類的isEmpty方法接口

public class ObjectUtil {
/**
* 判斷指定對象是否爲空,支持:
*
* <pre>
* 1. CharSequence
* 2. Map
* 3. Iterable
* 4. Iterator
* 5. Array
* </pre>
*
* @param obj 被判斷的對象
* @return 是否爲空,若是類型不支持,返回false
* @since 4.5.7
*/
@SuppressWarnings("rawtypes")
public static boolean isEmpty(Object obj) {
//obj爲null直接返回true
if (null == obj) {
return true;
}
//假如obj屬於字符串,則調用字符串工具類進行判斷,如下幾個相似
if (obj instanceof CharSequence) {
return StrUtil.isEmpty((CharSequence) obj);
} else if (obj instanceof Map) {
return MapUtil.isEmpty((Map) obj);
} else if (obj instanceof Iterable) {
return IterUtil.isEmpty((Iterable) obj);
} else if (obj instanceof Iterator) {
return IterUtil.isEmpty((Iterator) obj);
} else if (ArrayUtil.isArray(obj)) {
return ArrayUtil.isEmpty(obj);
}
return false;
}

}
相關文章
相關標籤/搜索