在作项目的的时候,调用了一个前同事的接口,发如今他的实现类里出现了一个问题:他使用了集合对象调用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; } }