提防包装类型的null值

简介:

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

复制代码
 1 public class Client {
 2     // 计算list中所有元素之和
 3     public static int f(List<Integer> list) {
 4         int count = 0;
 5         for (int i : list) {
 6             count += i;
 7         }
 8         return count;
 9     }
10 }
复制代码

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

复制代码
 1 public class Client {
 2     public static void main(String[] args) {  
 3          List<Integer> list = new ArrayList<Integer>();  
 4          list.add(1);  
 5          list.add(2);  
 6          list.add(null);  
 7          System.out.println(f(list));  
 8     } 
 9     // 计算list中所有元素之和
10     public static int f(List<Integer> list) {
11         int count = 0;
12         for (int i : list) {
13             count += i;
14         }
15         return count;
16     }
17 }
复制代码

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

Exception in thread "main" java.lang.NullPointerException 

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

复制代码
1 public static int f(List<Integer> list) {  
2      int count = 0;  
3      for (Integer i : list) {  
4           count += (i!=null)?i:0;  
5      }  
6      return count;  
7 } 
复制代码

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

 


本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/5424978.html,如需转载请自行联系原作者

相关文章
|
10月前
|
前端开发 JavaScript
前端冷知识(01):JS里的null是什么类型?
前端冷知识(01):JS里的null是什么类型?
187 0
|
9月前
|
JSON PHP 计算机视觉
php百度人脸识别param[image_template] is null使用BASE64图片类型json_decode返回NULL的处理解决方案
php百度人脸识别param[image_template] is null使用BASE64图片类型json_decode返回NULL的处理解决方案
91 0
|
9月前
|
JSON 数据格式
Retrofit,Gson解析,请求返回的类型不统一,假如double返回的是null
Retrofit,Gson解析,请求返回的类型不统一,假如double返回的是null
146 0
|
10月前
|
存储 otter 关系型数据库
BLOB和VARBINARY类型的字段不能设置为NULL
BLOB和VARBINARY类型的字段不能设置为NULL
149 1
|
Java 大数据 数据库连接
有关mybatis查询text类型的数据为NULL的情况
有关mybatis查询text类型的数据为NULL的情况
337 0
|
SQL 关系型数据库 MySQL
|
JavaScript Java Android开发
Android修行手册之Kotlin-【Null检查】、【类型检查】、【区间】篇
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
213 0
|
存储 C#
C# 值类型与引用类型 null与可空类型
本文目录 1. 值类型与引用类型 2. null的含义 3. 可空类型
160 0
|
Java
引用“.NET研究”类型赋值为null与加速垃圾回收
  在标准的Dispose模式中,提到了需要及时释放资源,却并没有进一步细说让引用等于null是否有必要。   有一些人认为等于null可以帮助垃圾回收机制早点发现并标识对象是垃圾。其他人则认为这没有任何帮助。
790 0
|
关系型数据库 MySQL RDS
timestamp类型在not null时可以插入null值?
背景 有同学问在RDS MySQL 5.6在timestamp 设置为 not null 并且SQL模式是严格模式时,仍然可以插入空值,理论上应该有报错,是不是RDS的bug? 环境 MySQL 5.
2360 0