在比較運算符運行前,會強制類型轉換 左值和右值;如果有一側的值是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> ......
}