在作項目的的時候,調用了一個前同事的接口,發如今他的實現類裏出現了一個問題:他使用了集合對象調用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; } }