java自動拆箱時的nullPointException問題解析
阿新 • • 發佈:2019-02-10
java1.5之後提供的自動裝箱和拆箱操作,簡化了程式碼的編寫,但是自動拆箱過程中容易引起nullPointExcetion。如果對其拆箱原理不理解將對很定位問題出現的原因。
原因:
例如如下程式碼:
public int findOrgIdByCode(String orgCode) {
return (Integer) super.queryForObject(DOMAIN_NAME_SPACE
+ "findOrgNameByCode", orgCode);
}
以上程式碼看似沒有問題,但如果在sql語句查詢為空時將會發生nullPointExcetion。
要了解發生異常的原因就需要知道拆箱的原理,拆箱是通過編譯器完成的。上述程式碼的class檔案通過反編譯後代碼如下:
public int findOrgIdByCode(String orgCode) {
return ((Integer) super.queryForObject(
"sys.DomainTree.findOrgIdByCode", orgCode)).intValue();
}
通過上述程式碼的對比就可以很容易看出問題出現的原因,自動拆箱是通過Integer.intValue()來實現的,所以當查詢無資料時將會出現空指標異常。
解決辦法:
瞭解了上述問題出現的原因後,當無法保證拆箱前的資料不為空時需要對該資料做非空判斷來防止空指標的出現。將上述程式碼修改後:
public int findOrgIdByCode(String orgCode) {
Integer orgId = (Integer) super.queryForObject(DOMAIN_NAME_SPACE
+ "findOrgIdByCode", orgCode);
return null == orgId ? 0 : orgId;
}
該程式碼反編譯後:
public int findOrgIdByCode(String orgCode) { Integer orgId = (Integer) super.queryForObject( "sys.DomainTree.findOrgIdByCode", orgCode); return ((orgId == null) ? 0 : orgId.intValue()); }
經過上述處理後就不會發生空指標異常。
總結:
自動拆箱時(以Integer為例)呼叫包裝型別的intValue()來進行拆箱,需要注意null.intValue()引起的空指標。