平凡也就两个字: 懒和惰;
成功也就两个字: 苦和勤;
优秀也就两个字: 你和我。
跟着我从0学习JAVA、spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美!
关注微信公众号【 IT特靠谱 】,每天都会分享技术心得~
NullPointException空指针异常踩坑—a.equals(b)
今天在测试环境发现了一个bug,就是大名鼎鼎的空指针异常java.lang.NullPointException。这个问题是非常好解决的,因为导致空指针异常的无外乎就那几种情况。这里我遇到了其中之一:a.equals(b),即比较a和b两个字符串是否相等。
问题原因:我想比较a和b两个字符串是否相等,但是搞忘了a可能为null的情况,所以抛出了空指针异常!
解决办法:在工作生产过程中,比较两个字符串或对象是否相等,尽量不要用a.equals(b)的方式,推荐用Objects.equals(a, b)来代替,当然也可以用Optional。
下面的代码演示了用Objects.equals(b)来比较两个对象是否相等,避免了a对象为null时抛出空指针异常的情况。
import java.util.Objects;
public class Main {
public static void main(String[] args) {
equalsTest();
}
/**
* 测试a.equals(b)和Objects.equals方法
*/
private static void equalsTest() {
String a = "1";
String b = "1";
System.out.println("a.equals(b):" + a.equals(b));
try {
a = null;
b = "1";
//这里会抛空指针异常!
a.equals(b);
} catch (Exception e) {
System.out.println("a.equals(b)报空指针异常!");
e.printStackTrace();
}
a = "1";
b = "1";
System.out.println("Objects.equals(a, b):" + Objects.equals(a, b));
a = null;
b = "1";
System.out.println("Objects.equals(a, b)不报空指针异常:" + Objects.equals(a, b));
}
}
运行结果:
为什么Objects.equals(a, b)能避免产生空指针异常呢,我们需要从其源码进行分析(下图)。从源码逻辑可以分析可知:
(1)如果a为null,且b为null的时候(a==b)为true;
(2)如果a为null,且b不为null的时候(a==b)为false;
(3)如果a不为null时,实际上调用的是a.eauqls(b)方法,因为a不为null,所以不会抛空指针异常。
/**
* Returns {@code true} if the arguments are equal to each other
* and {@code false} otherwise.
* Consequently, if both arguments are {@code null}, {@code true}
* is returned and if exactly one argument is {@code null}, {@code
* false} is returned. Otherwise, equality is determined by using
* the {@link Object#equals equals} method of the first
* argument.
*
* @param a an object
* @param b an object to be compared with {@code a} for equality
* @return {@code true} if the arguments are equal to each other
* and {@code false} otherwise
* @see Object#equals(Object)
*/
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
如果你有问题或需要更进一步学习,关注微信公众号吧!