假设程序中需实现一个公用的方法f,用来统计一个整数list中所有值的和,思路很简单,如下:
public static int f(List<Integer> list){
int count = 0;
for(int i:list){
count += I;
}
return count;
}
方法写好后,我们在main方法中调用之,如下:
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(null);
System.out.println(f(list));
我们知道,jdk1.5之后的版本提供了自动装/拆箱功能。上述程序中,list添加了一个值null的元素,那么拆箱后,该值应该会自动变成0吧?
执行上述程序后会发现,不是这样的。
程序会报出空指针异常,这是为什么呢?
其实,如果了解jdk1.5以前的版本中包装类型拆箱的实现方法,答案不难得出,jdk1.5以前的版本,拆箱是这样做的:
int i=j.intValue();//手动拆箱操作
java提供了自动拆箱功能后,例如Integer a = 2这样的操作,在底层依然是调用 intValue()方法,所以在上述报错代码中,null值调用intValue()方法,自然会报出空指针异常。
所以一个简单的求和方法,如果涉及到包装类与基本类型之间的转换,也要做足判断,避免不必要的bug。