整形自動拆包引起的NPE

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章