Java基本類型與對象類型的區別導致的Bug剖析
本文中所提到的基本類型是指類似 int,long等,而對象類型是指Integer,Long等。
基本類型和對象類型第一個最大的不同在于初始化的值不同。int 初始化為0,Integer 為null。在一個線上產品故障的排查過程中發現根本原因在于開發同學把數據庫DO對象的一個字段從int 改成了Integer引起的,因為int 類型可以正常的初始化,而Integer 對象的時候不能正常插入,導致了線上產品故障。
正是由于初始化的值的不同,也導致了在進行邏輯比較的時候,對象類型很容易出現空指針異常:
基本類型可以直接進行邏輯判斷:
int num; if( num >0 ){ //todo } |
這樣的代碼不會有空指針的異常,但是如果是如下代碼:
Integer num; if( num >0 ){ //todo } |
就會有空指針異常。這種異常特別容易出現在web的參數處理上:
例如:
public class MyTest { @Autowired private HttpServletResponse response; public void execute(@Param("pageSize") Integer pageSize) throws Exception { //todo //這里容易空指針異常 if( pageSize<=0 ){ pageSize = 1; } //todo } } |
第二個不同在于基本類型沒有可執行的方法,而對象類型支持很多封裝的方法,例如Integer 對象 可以使用toString()的方法。
第三個不同在于基本類型不能作為List或者Map的類型,例如:
List<int> numList = new ArrayList<int>(); //這樣是不可以的。