建议26: 提防包装类型的null值

我们知道Java引入包装类型(Wrapper Types)是为了解决基本类型的实例化问题,以便让一个基本类型也能参与到面向对象的编程世界中。而在Java 5中泛型更是对基本类型说了“不”,如想把一个整型放到List中,就必须使用Integer包装类型。我们来看一段代码:

 public class Client {
// 计算list中所有元素之和
public static int f(List<Integer> list) {
int count = 0;
for (int i : list) {
count += i;
}
return count;
}
}

接收一个元素是整型的List参数,计算所有元素之和,这在统计、报表项目中很常见,我们来看看这段代码有没有问题。遍历一个列表,然后相加,应该没有问题。那我们再来写一个方法调用,代码如下:

 public class Client {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(null);
System.out.println(f(list));
}
// 计算list中所有元素之和
public static int f(List<Integer> list) {
int count = 0;
for (int i : list) {
count += i;
}
return count;
}
}

把1、2和空值都放到List中,然后调用方法计算,现在来思考一下会不会出错。应该不会出错吧,基本类型和包装类型都是可以通过自动装箱(Autoboxing)和自动拆箱(AutoUnboxing)自由转换的,null应该可以转为0吧,真的是这样吗?我们运行一下看看结果:

Exception in thread "main" java.lang.NullPointerException 

运行失败,报空指针异常,我们稍稍思考一下很快就知道原因了:在程序的for循环中,隐含了一个拆箱过程,在此过程中包装类型转换为了基本类型。我们知道拆箱过程是通过调用包装对象的intValue方法来实现的,由于包装对象是null值,访问其intValue方法报空指针异常也就在所难免了。问题清楚了,修改也很简单,加入null值检查即可,代码如下:

 public static int f(List<Integer> list) {
int count = 0;
for (Integer i : list) {
count += (i!=null)?i:0;
}
return count;
}

上面以Integer和int为例说明了拆箱问题,其他7个包装对象的拆箱过程也存在着同样的问题。包装对象和拆箱对象可以自由转换,这不假,但是要剔除null值,null值并不能转化为基本类型。对于此类问题,我们谨记一点:包装类型参与运算时,要做null值校验。

[改善Java代码]提防包装类型的null值的更多相关文章

  1. [改善Java代码] 谨慎包装类型的大小比较

    建议27:谨慎包装类型的大小比较 基本数据类型比较大小木有问题,不过其对应的包装类型大小比较就需要注意了.看如下代码: public class Client { public static void ...

  2. [改善Java代码]避开基本类型数组转换列表陷阱

    开发中经常用到Arrays和Collections这两个工具类. 在数组和列表之间进行切换.非常方便.但是也会遇到一些问题. 看代码: import java.util.Arrays; import ...

  3. [改善Java代码]不要让类型默默转换

    建议23:不要让类型默默转换 public class Client { // 光速是30万公里/秒,常量 public static final int LIGHT_SPEED = 30 * 100 ...

  4. [改善Java代码]用整数类型处理货币

    建议22:用整数类型处理货币. public class Client { public static void main(String[] args) { System.out.println(&q ...

  5. 【Java心得总结一】Java基本类型和包装类型解析

    说到数据类型这个问题是一个基本的不能再基本的问题,我们当初编程入门第一课一般就是讲数据类型,而今天我想记录的是一个在Java中容易忽略的问题,即基本类型和包装类型. 一.基本类型出现的原因 我们都知道 ...

  6. Java笔记10-Object包装类型字符串

    提纲: 1.java.lang.0bject中常用方法介绍 2.基本类型对应的包装类型的介绍 以及基本类型和包装类型之间的相互转换 3.java.lang.String 字符串处理类 java.lan ...

  7. Java Bean 使用包装类型 还是基本类型

    参考:实体类中用基本类型好,还是用包装类型好_ - 牵牛花 - 博客园 int优缺点 优点: 1.用于Bean的时候,有默认值.比如自己拼接sql增加一个User时,会方便很多,不过现在都用ORM框架 ...

  8. [改善Java代码]equals应该考虑null值的情景

    建议46: equals应该考虑null值情景 继续上一建议的问题,我们解决了覆写equals的自反性问题,是不是就很完美了呢?再把main方法重构一下: public class Client { ...

  9. [改善Java代码]别让null值和空值威胁到变长方法

    建议5:别让null值和空值威胁到变长方法 public class Client { public void methodA(String str,Integer... is){ } public ...

随机推荐

  1. 7-wonders-in-java

    https://code.google.com/p/7-wonders-in-java/

  2. Struts2的国际化

    1.概述 把在无需改写源代码即可让开发出来的应用程序能够支持多种语言和数据格式的技术称为国际化. 与国际化对应的是本地化, 指让一个具备国际化支持的应用程序支持某个特定的地区 Struts2国际化是建 ...

  3. SMTP邮件服务器配置

    QQ个人邮箱使用: smtp.qq.com端口为25 密码是个人邮箱密码 QQ企业邮箱使用: smtp.exmail.qq.com端口为25 密码是邮箱密码 163邮箱使用 smtp.163.com端 ...

  4. POJ 3671 Dining Cows (DP,LIS, 暴力)

    题意:给定 n 个数,让你修改最少的数,使得这是一个不下降序列. 析:和3670一思路,就是一个LIS,也可以直接暴力,因为只有两个数,所以可以枚举在哪分界,左边是1,右边是2,更新答案. 代码如下: ...

  5. 数据持久化之sharedpreference的使用

    要将数据持久化到手机移动设备有多种方法,其中有一种是通过sharedpreference来实现. 首先将sharedpreference初始, private SharedPreferences sp ...

  6. Spring MVC Framework 实例

    一 SpringMVC基础入门,创建一个HelloWorld程序 1 首先,导入SpringMVC需要的jar包. commons-logging-<version>.jar spring ...

  7. 应用完全启动后, Spring执行自定义初始化

    项目中做敏感词过滤, 因为前台ajax校验要走service ,而后台统一过滤器要走interceptor , 所以把检查器提到一个工具类(HeXieWordFinder)里 这个工具类理应缓存数据库 ...

  8. (转)WordPress的主查询函数-query_posts()

    今天说说WordPress 的主查询函数 -query_posts(),因为我正在制作的主题里面多次用到了这个函数 . query_posts()查询函数决定了哪些文章出现在WordPress 主 循 ...

  9. 正整数的n次方求和

    引理: (Abel分部求和法) $$\sum_{k=1}^{n}a_{k}b_{k}=A_{n}b_{n}+\sum_{k=1}^{n-1}A_{k}(b_{k}-b_{k+1})$$其中$A_{k} ...

  10. list删除操作 java.util.ConcurrentModificationException

    首先大家先看一段代码: public static void main(String[] args) { List<String> listStr = new ArrayList<S ...