刚才在刷题过程中掉进了一个坑里,众所周知,Java语法中&&运算符有短路的功能,比如如下代码:
public class Main{
public static void main(String[] args) {
String s = null;
if (1>2 && s.equals("hehe")) {
System.out.println("haha");
}
}
}
1>2 && s.equals("hehe")
这个判定条件只判定完1>2
就会得出结论,结果是false
,并不会执行s.equals("hehe")
。
改为1<2后
,执行s.equals("hehe")
,会报错:
Exception in thread "main" java.lang.NullPointerException
at main.Main.main(Main.java:8)
那么我掉进什么坑里了呢?我写下了类似于下方示例的代码:
import java.util.*;
public class Main{
public static void main(String[] args) {
String s = null;
String s2 = null;
if (1>2 && s.equals("hehe") || s2.equals("heihei")) {
System.out.println("haha");
}
}
}
按照上面所介绍的短路的思想,我以为1>2 && s.equals("hehe") || s2.equals("heihei")
也只会执行到1>2
就结束了,可是程序运行的结果却是:
Exception in thread "main" java.lang.NullPointerException
at main.Main.main(Main.java:9)
为什么呢?短路代码失效?Java改版了?基础不牢,底盘不稳 = =
原因在于||
运算符的优先级是高于&&
的,所以说1>2 && s.equals("hehe") || s2.equals("heihei")
中1>2 && s.equals("hehe")
是判定的第一部分,这一部分中的s.equals("hehe")
确实是被短路了,但是后边的s2.equals("heihei")
就报错了。
若是有看官看到这里被绕晕了,意思就是说,||运算符优先级高于&&。