在这看到的代码,第二次调用 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中,自动装箱和自动拆箱机制会导致一些 Counterintuitive 的结果。例如,以下代码: ```java public static void main(String[] args) { Integer integer0 = 127; Integer ...
`则会自动拆箱。 4. **变量注解(Annotations)** 注解是元数据的一种形式,提供了一种向编译器或JVM传递元数据的方式。它们可以用于标记类、方法、变量等,以实现代码的自动生成、编译时验证或运行时处理。 5. *...
- **自动装箱与拆箱**:自动装箱将基本类型与对应的包装类之间进行自动转换,而自动拆箱则反之,简化了代码编写。 - **可变参数**:一个方法可以接受不定数量的参数,这在处理函数式编程或动态参数列表时非常有用...
安装JDK 17.0.3后,开发者可以利用Java 17的特性编写代码,例如使用封箱自动拆箱优化、文本块(Text Blocks)等新功能。此外,JDK还包含JRE(Java Runtime Environment),使得计算机可以运行基于Java的应用程序。 ...
1. **自动装箱与拆箱**:Java中的`Integer`等包装类提供了自动装箱和拆箱功能,方便了开发者操作。但需要注意,虽然在基本类型和包装类之间可以直接转换,但它们并不共享同一个缓存池,可能导致不必要的对象创建,...
3. **自动装箱与拆箱(Autoboxing and Unboxing)** 自动装箱允许在原始类型和对应的包装类之间自动转换,简化了代码,减少了手动转换的繁琐。 4. **变量长度数组(Varargs)** 变量长度参数允许方法接受任意数量...
JavaSE 5.0引入了重要的新特性,如自动装箱拆箱、泛型、枚举类型和可变参数,大大提高了代码的可读性和安全性。 JavaEE(Java Enterprise Edition)是Java在企业级应用开发中的扩展,它构建于JavaSE之上,提供了Web...
3. **自动装箱/拆箱**:自动将基本类型与对应的包装器类之间转换,简化了编程。 4. **增强的for循环**(foreach):提供了一种简洁的遍历集合和其他迭代对象的方式。 5. **变量参数**:允许方法接受不定数量的参数,...
- **自动装箱/拆箱(Autoboxing and Unboxing)**:简化了基本类型与对应的包装类之间的转换。 - **变量注解(Annotations)**:允许在代码中添加元数据,用于编译时或运行时的处理。 - **类型推断(Type ...
- 避免使用包装类型进行数值运算,避免自动装箱拆箱导致的性能损耗。 - 非空检查时优先使用基本类型,以避免空指针异常。 4. **异常处理** - 不要捕获并忽略异常,除非有明确的理由。 - 异常处理应具体到最细...
7. **Primitives**:Guava提供了对原始类型(如int、long)的包装,避免了自动装箱和拆箱带来的额外开销。 了解Guava-r09-jar在Mahout中的作用,可以帮助开发者更好地理解Mahout如何处理大规模数据,并利用Guava...
1. **Run automatically**: 选择此选项后,每次保存Java文件时,FindBugs会自动运行并分析代码,提供实时反馈。 2. **Minimum rank to report**: 这个设置允许用户根据错误的严重性级别筛选报告。FindBugs将错误...
Java 5引入了许多新特性,如枚举、泛型、自动装箱/拆箱、可变参数等,编码时应充分利用这些特性,提高代码的类型安全性和可读性。 ### 性能 优化性能时应注意: 1. 避免在循环中创建不必要的对象。 2. 使用适当的...
13. 装箱与拆箱(Boxing and Unboxing):装箱是将值类型转换为对象,拆箱则是将对象转换回其原始的值类型。 14. 属性(Property):属性提供了一种访问类成员变量的封装方式,可以添加验证逻辑。 15. 领域驱动...
装箱,拆箱以及反射 动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 ...
装箱与拆箱 ? 委托 ? 继承与多态 以下主题不会进行讨论: ? C++ 与 C# 的共同点 ? 诸如垃圾回收、线程、文件处理等概念 ? 数据类型转换 ? 异常处理 ? .NET 库 编程结构 和 C++ 一样,C# 是大小写敏感的。半角...
- Java 1.5(也称为Java 5.0)是Java平台的重大更新,引入了许多新特性和改进,如泛型、枚举、自动装箱/拆箱、可变参数等。TabSearch基于这个版本,意味着它依赖这些特性来实现高效和灵活的代码结构。 3. **开源...
75. **Unboxing**:拆箱,将包装类对象转换回基本类型。 76. **Primitive**:基本的,与基本数据类型相关的。 77. **Compiler Sugar**:编译器蜜糖,提高可读性的语法糖。 78. **Array**:数组,存储相同类型数据的...
因为JAVA的自动装箱与拆箱机制,不需要根据场景来区分数据类型。 D .所有的局部变量推荐使用基本数据类型。 多选 12.关于索引的设计,下列哪些说法符合《阿里巴巴Java开发手册》:ACD A .对varchar类型的字段...
在压缩包文件“issues-30909-main”中,通常会包含源代码、日志文件、bug报告或其他相关信息,这些可以帮助进一步分析和解决具体问题。为了给出更精确的解答,我们需要查看这些文件内容,了解问题的详细情况。如果你...