在做项目的的时候,调用了一个前同事的接口,发现在他的实现类里出现了一个问题:他使用了集合对象调用isEmpty()方法用来判断集合是否为空。这种做法初看一直看不出什么问题,后来经过了小测试终于发现了问题。
先贴上代码:
/**
* @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)
同样,下面的代码打印的是结果是一样的:
/**
* @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;
}
}