`
jslfl
  • 浏览: 316081 次
  • 性别: 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
分享到:
评论

相关推荐

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

    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. **变量参数**:允许方法接受不定数量的参数,...

    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将错误...

    文档java代码规范

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

    GitTest2

    13. 装箱与拆箱(Boxing and Unboxing):装箱是将值类型转换为对象,拆箱则是将对象转换回其原始的值类型。 14. 属性(Property):属性提供了一种访问类成员变量的封装方式,可以添加验证逻辑。 15. 领域驱动...

    asp.net知识库

    装箱,拆箱以及反射 动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 ...

    在一小时内学会 C#(txt版本)

    装箱与拆箱 ? 委托 ? 继承与多态 以下主题不会进行讨论: ? C++ 与 C# 的共同点 ? 诸如垃圾回收、线程、文件处理等概念 ? 数据类型转换 ? 异常处理 ? .NET 库 编程结构 和 C++ 一样,C# 是大小写敏感的。半角...

    TabSearch-开源

    - Java 1.5(也称为Java 5.0)是Java平台的重大更新,引入了许多新特性和改进,如泛型、枚举、自动装箱/拆箱、可变参数等。TabSearch基于这个版本,意味着它依赖这些特性来实现高效和灵活的代码结构。 3. **开源...

    Java___英语词汇表.doc

    75. **Unboxing**:拆箱,将包装类对象转换回基本类型。 76. **Primitive**:基本的,与基本数据类型相关的。 77. **Compiler Sugar**:编译器蜜糖,提高可读性的语法糖。 78. **Array**:数组,存储相同类型数据的...

    阿里巴巴编码规范 基础技能认证 考题分析(考题+答案).docx

    因为JAVA的自动装箱与拆箱机制,不需要根据场景来区分数据类型。 D .所有的局部变量推荐使用基本数据类型。 多选 12.关于索引的设计,下列哪些说法符合《阿里巴巴Java开发手册》:ACD A .对varchar类型的字段...

    issues-30909

    在压缩包文件“issues-30909-main”中,通常会包含源代码、日志文件、bug报告或其他相关信息,这些可以帮助进一步分析和解决具体问题。为了给出更精确的解答,我们需要查看这些文件内容,了解问题的详细情况。如果你...

Global site tag (gtag.js) - Google Analytics