• 坑在哪里?
 
我们都知道Java的八种基本数据类型:int, short, long, double, byte, char, float, boolean
 
分别有各自对应的包装类型:Integer, Short, Long, Double, Byte, Character, Float, Boolean
 
并且二者之间可以相互直接赋值,例如:
 // 基本数据类型赋值给封装类
inta = 1;
Integer b = a;
// 封装类型赋值给基本数据类型
Character c = new Character('c');
chard = c;
但是,当包装类赋值给基本数据类型的时候,如果包装类型为空,那么自动拆箱(auto-unboxing)就会有问题了:
 Integer i = null;
intj = i;
这样的代码,虽然可以编译通过,但IDE会提示自动拆箱的时候包装类是不允许为空的,
 
Null pointer access: This expression of type Integer is null but requires auto-unboxing
 
这是为什么呢?
 
debug你就会发现,Integer自动拆箱调的是Integer.intValue()方法,所以,如果对象本身为空的话,调内部的方法就会抛空指针了。
 
  • 为什么会被坑呢?
既然IDE都给提示了,应该不会犯这种低级错误吧?!呵呵。。。
 
那如果是将A对象的Integer成员变量赋值给了B对象的int类型变量呢?往往有人就这么写了:
 
b.setIntVal(a.getIntegerVal());
 
这不正是把Integer赋值给了int类型吗,而如果此时的A对象中的这个Integer变量正好为空,bingo!恭喜你,空指针异常!!!
 
  • 怎么能不被坑呢?
    1. 如果是两个意义完全相同的字段,请保证类型和变量名完全一致
    2. 表示同一种类的字段 类型定义一致,例如: 价格字段 都定义成float 或Float
  • 还有没有其他坑?
有,基本数据类型和包装类之间的比较应该用 equals 还是 == ?
 
 

那些年一起踩过的坑 — java 自动装箱拆箱问题的更多相关文章

  1. java自动装箱拆箱总结

    对于java1.5引入的自动装箱拆箱,之前只是知道一点点,最近在看一篇博客时发现自己对自动装箱拆箱这个特性了解的太少了,所以今天研究了下这个特性.以下是结合测试代码进行的总结. 测试代码: int a ...

  2. JAVA自动装箱拆箱与常量池

    java 自动装箱与拆箱 这个是jdk1.5以后才引入的新的内容,作为秉承发表是最好的记忆,毅然决定还是用一篇博客来代替我的记忆: java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的 ...

  3. Java自动装箱拆箱

    一.装箱.拆箱定义 如果一个int型量被传递到需要一个Integer对象的地方,那么,编译器将在幕后插入一个对Integer构造方法的调用,这就叫做自动装箱.而如果一个Integer对象被放到需要in ...

  4. 深入理解Java自动装箱拆箱机制

    1.自动装箱与拆箱的定义 装箱就是自动将基本数据类型转换为包装器类型(int-->Integer): 拆箱就是自动将包装器类型转换为基本数据类型(Integer-->int). Java中 ...

  5. Java 自动装箱/拆箱

    自动装箱/拆箱大大方便了基本类型(8个基本类型)数据和它们包装类的使用 自动装箱 : 基本类型自动转为包装类(int >> Integer) 自动拆箱: 包装类自动转为基本类型(Integ ...

  6. Java 的自动装箱拆箱

    Java 是面向对象的语言,其基本数据类型也就有了相对应的类,称为包装类.以下是基本数据类型对应的包装类: 基本数据类型 包装类 byte(1字节) Byte short(2字节) Short int ...

  7. Java八种基本数据类型的大小,以及封装类,自动装箱/拆箱的用法?

    参考:http://blog.csdn.net/mazhimazh/article/details/16799925 1. Java八种基本数据类型的大小,以及封装类,自动装箱/拆箱的用法? 原始类型 ...

  8. java基础1.5版后新特性 自动装箱拆箱 Date SimpleDateFormat Calendar.getInstance()获得一个日历对象 抽象不要生成对象 get set add System.arrayCopy()用于集合等的扩容

    8种基本数据类型的8种包装类 byte Byte short Short int Integer long Long float Float double Double char Character ...

  9. Java的自动装箱/拆箱

    概述 自JDK1.5开始, 引入了自动装箱/拆箱这一语法糖, 它使程序员的代码变得更加简洁, 不再需要进行显式转换.基本类型与包装类型在某些操作符的作用下, 包装类型调用valueOf()方法将原始类 ...

随机推荐

  1. bnu 4352 XsugarX的疯狂按键识别(暴力模拟)

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=4352 [题意]:给你个长串,输出该长串中能第一放出的技能,每个技能有对应的一个小子串,不能放出任何技 ...

  2. Object调用静态方法

    谁说空指针不能调用方法 public class Foo { public static void bar() { System.out.println("bar"); } pub ...

  3. ECNU1104-BFS

    简单的BFS题意:多起点多终点 /* 简单的BFS 题意:多起点多终点 */ #include<stdio.h> #include<string.h> #include< ...

  4. eclipse代码自动提示功能设置

    一 般默认情况下,Eclipse ,MyEclipse的代码提示功能是比Microsoft Visual Studio的差很多的,主要是Eclipse ,MyEclipse本身有很多选项是默认关闭的, ...

  5. SSL构建单双向https认证

    1.  SSL基本介绍 我们常常在使用网上银行时看到的连接都是以“https”开始的,那么这个https是什么呢?这其实是表示目前连接使用了SSL进加密,能保证客户端到服务器端的通信都在被保护起来,那 ...

  6. Java web 项目搭建

    Java web 项目搭建 简介 在上一节java web环境搭建中,我们配置了开发java web项目最基本的环境,现在我们将采用Spring MVC+Spring+Hibernate的架构搭建一个 ...

  7. Magento学习

    Magento是一个php电子商务系统. 内部模块化. 创建模块流程 Magento系统模块 app/code/core/Mage 其中每一个子目录都是一个单独的模块 自己创建的模块放在下面路径 ap ...

  8. POJ1416——Shredding Company(DFS)

    Shredding Company DescriptionYou have just been put in charge of developing a new shredder for the S ...

  9. POJ3083——Children of the Candy Corn(DFS+BFS)

    Children of the Candy Corn DescriptionThe cornfield maze is a popular Halloween treat. Visitors are ...

  10. uva 11817 - Tunnelling the Earth

    题意:从地球上的一个点到另一个点,求两点的球面距离和直线距离之差.假定地球是正球体,半径为6371009米. #include<iostream> #include<cmath> ...