`
jslfl
  • 浏览: 323764 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

自动拆箱的bug

JVM 
阅读更多
在这看到的代码,第二次调用 fun时,出NULL指针异常,看了下面网友的分析,针对这题还是不太明白,朋友们再讲解下...
public class Test {
public static void main(String[] args) {
// print "foo"
fun(null);

// NullPointerException
int i = 2;
fun(i == 0 ? true : (i == 1 ? false : null));
}

private static void fun(Boolean b) {
System.out.println("foo");
}
}


自动拆箱引发的bug,看这段代码:
Boolean a = null;
Boolean b = 1 == 0 ? true : a;

这里会被编译为:
首先计算1 == 0的boolean值
然后调用a.booleanValue()返回a的拆箱
然后对三元运算符的结果在进行装箱

在这里a.booleanValue()由于a是null所以就报NullPointer了
附上这段代码编译后的字节码:
0: aconst_null
1: astore_1
2: aload_1
3: invokevirtual #2; //Method java/lang/Boolean.booleanValue:()Z
6: invokestatic #3; //Method java/lang/Boolean.valueOf:(Z)Ljava/lang/Boolean;
9: astore_2
10: return


原文http://www.oschina.net/code/snippet_273190_14374
分享到:
评论

相关推荐

    浅析C# 装箱和拆箱

    此外,装箱后的对象在拆箱后不是原来的引用,这意味着对装箱对象的修改不会影响原始值类型,这可能会引发意外的bug。 为了避免不必要的装箱和拆箱,可以考虑以下策略: 1. 使用泛型:C# 2.0引入的泛型允许创建类型...

    Java实体类不要使用基本类型的知识点总结

    最后,让我们来讨论一下为什么在Java中,自动装箱和自动拆箱机制会导致一些 Counterintuitive 的结果。例如,以下代码: ```java public static void main(String[] args) { Integer integer0 = 127; Integer ...

    jdk-1_5_0_22-windows-i586-p

    `则会自动拆箱。 4. **变量注解(Annotations)** 注解是元数据的一种形式,提供了一种向编译器或JVM传递元数据的方式。它们可以用于标记类、方法、变量等,以实现代码的自动生成、编译时验证或运行时处理。 5. *...

    javaVM jre-1_5_0_06

    - **自动装箱与拆箱**:自动装箱将基本类型与对应的包装类之间进行自动转换,而自动拆箱则反之,简化了代码编写。 - **可变参数**:一个方法可以接受不定数量的参数,这在处理函数式编程或动态参数列表时非常有用...

    jdk-17.0.3_linux-x64_bin.deb.zip

    安装JDK 17.0.3后,开发者可以利用Java 17的特性编写代码,例如使用封箱自动拆箱优化、文本块(Text Blocks)等新功能。此外,JDK还包含JRE(Java Runtime Environment),使得计算机可以运行基于Java的应用程序。 ...

    Java 一些值得注意的细节

    1. **自动装箱与拆箱**:Java中的`Integer`等包装类提供了自动装箱和拆箱功能,方便了开发者操作。但需要注意,虽然在基本类型和包装类之间可以直接转换,但它们并不共享同一个缓存池,可能导致不必要的对象创建,...

    藏经阁-Java开发手册(泰山版)灵魂13问-117.pdf

    手册指出,当涉及自动拆箱时,三目运算符可能导致空指针异常(NullPointerException)。这是因为Java自动将包装类型的值转化为基本类型,如果值为null,会尝试拆箱,从而抛出异常。例如,`null ? 1 : 0`在编译时不会...

    jdk1.5.22.zip

    3. **自动装箱与拆箱(Autoboxing and Unboxing)** 自动装箱允许在原始类型和对应的包装类之间自动转换,简化了代码,减少了手动转换的繁琐。 4. **变量长度数组(Varargs)** 变量长度参数允许方法接受任意数量...

    javase javaee jQuery struts js api

    JavaSE 5.0引入了重要的新特性,如自动装箱拆箱、泛型、枚举类型和可变参数,大大提高了代码的可读性和安全性。 JavaEE(Java Enterprise Edition)是Java在企业级应用开发中的扩展,它构建于JavaSE之上,提供了Web...

    jdk-1_5_0_20-windows-i586-p.exe

    3. **自动装箱/拆箱**:自动将基本类型与对应的包装器类之间转换,简化了编程。 4. **增强的for循环**(foreach):提供了一种简洁的遍历集合和其他迭代对象的方式。 5. **变量参数**:允许方法接受不定数量的参数,...

    Java面向对象程序设计语言课程设计指导书.pdf

    5. Java的版本和新特性:文档中的“Java24567”可能是指Java的不同版本,例如Java 1.2、Java 1.3、Java 1.4、Java 5、Java 6和Java 7等,各自引入了不同的新特性,如泛型、自动装箱和拆箱、增强型for循环、枚举类型...

    jdk1.5.0_12.zip

    - **自动装箱/拆箱(Autoboxing and Unboxing)**:简化了基本类型与对应的包装类之间的转换。 - **变量注解(Annotations)**:允许在代码中添加元数据,用于编译时或运行时的处理。 - **类型推断(Type ...

    阿里巴巴代码规范

    - 避免使用包装类型进行数值运算,避免自动装箱拆箱导致的性能损耗。 - 非空检查时优先使用基本类型,以避免空指针异常。 4. **异常处理** - 不要捕获并忽略异常,除非有明确的理由。 - 异常处理应具体到最细...

    mahout的guava-r09-jar

    7. **Primitives**:Guava提供了对原始类型(如int、long)的包装,避免了自动装箱和拆箱带来的额外开销。 了解Guava-r09-jar在Mahout中的作用,可以帮助开发者更好地理解Mahout如何处理大规模数据,并利用Guava...

    Findbugs配置及说明.docx

    1. **Run automatically**: 选择此选项后,每次保存Java文件时,FindBugs会自动运行并分析代码,提供实时反馈。 2. **Minimum rank to report**: 这个设置允许用户根据错误的严重性级别筛选报告。FindBugs将错误...

    jdk1.6 1.7 1.8

    2. **字符串拆箱**:自动将字符串转换为基本类型。 3. **二进制整数文字**:支持直接使用二进制表示整数。 4. **类型推断**:在创建泛型实例时可以省略类型参数,提高编码效率。 5. **文件通道映射**:改进了文件I/O...

    文档java代码规范

    Java 5引入了许多新特性,如枚举、泛型、自动装箱/拆箱、可变参数等,编码时应充分利用这些特性,提高代码的类型安全性和可读性。 ### 性能 优化性能时应注意: 1. 避免在循环中创建不必要的对象。 2. 使用适当的...

    2010年3月计算机等级考试二级Java笔试试题

    同时,Java的自动装箱和拆箱机制使得在基本类型和对应的包装类之间转换更为便捷。 5. **八进制数识别**:在Java中,八进制数以数字0开头(如026),用于表示非十进制的数值,但在现代Java版本中,这种方式已不推荐...

    2018年JAVA架构师面试后的问题汇总-word范文 (2页).docx

    JDK1.5引入了自动装箱拆箱、枚举类型、变量赋值检查、泛型、动态代理、可变参数等特性,提高了编程效率和代码的可读性。 2. **字符流与字节流的区别**: 字符流处理的是Unicode字符,适用于文本处理;字节流处理...

Global site tag (gtag.js) - Google Analytics