在比较运算符运行前,会强制类型转换 左值和右值;如果有一侧的值是null,则编译不过去,如果运行时才能确定左值或右值真实值,则运行时会抛出NPE。
public static void main(String[] args) {
Integer a = null;
System.out.println(1 == null); //The operator == is undefined for the argument type(s) int, null
// java.lang.NullPointerException
System.out.println((int) a);
// java.lang.NullPointerException
System.out.println(1 == a);
// java.lang.NullPointerException
System.out.println(a == 1);
}
1 对象的比较、Integer类的flighWeight模式
public static void main(String[] args) {
Integer a = 1000;
Integer b = 1000;
System.out.println(a == b); <span style="color:#ff0000;"> //false</span>
System.out.println((int) a == b); // true
System.out.println(a == (int) b); // true
System.out.println(a.equals(b)); // true
Integer c = 127;
Integer d = 127;
System.out.println(c == d); // true (-128~127缓存了对象,每次比较使用cache里的对象)
c = 128;
d = 128;
System.out.println(c == d); // true
}
2 对象比较的右值可以是null,prime类型的右值不能是null
public static void main(String[] args) {
Integer a = 1000;
System.out.println(a == null); //false
System.out.println((int)a == null); //The operator == is undefined for the argument type(s) int, null
}
3 2016-8-19日又发生一次NPE的事件:
改前的逻辑;
rulesDO.getSettlementPriod()
这句可能为null
if ( rulesDO != null && WEEKLY_SETTLEMENT.getType().intValue() == rulesDO.getSettlementPriod() ) {
......
}
改后的逻辑
Long settlementPeriod = nbSettlementRulesDO.getSettlementPriod();
if (settlementPeriod != null && WEEKLY_SETTLEMENT.getType().intValue() == rulesDO.getSettlementPriod()) {
<span style="white-space:pre"> </span> ......
}