自动拆箱调用方法原理

简介: 自动拆箱调用方法原理

今天分享一个冷门基础小知识

我们一般使用boolean的类型,使用结构控制语句条件表达式的时候都是这样:

if (bar) {
}

此处如果是一个基本类型,也就是boolean的时候,完全ok

但如果是一个包装类型的java.lang.Boolean对象,则在barnull的时候,抛出

java.lang.NullPointerException

这是因为底层调用了java.lang.Boolean#valueOf(boolean)拆箱

此处

@IntrinsicCandidate
public static Boolean valueOf(boolean b) {
    return (b ? TRUE : FALSE);
}

由于添加了@IntrinsicCandidate注解,所以会调用其进行自动拆箱

因此如果是Boolean包装类型,则调用

if (bar) {
}

等同于

if (Boolean.valueOf(bar)) {
}

建议大家不要使用包装类型作为条件语句表达式,此处sonarlint也提到:

https://rules.sonarsource.com/java/RSPEC-5411/

Avoid using boxed “Boolean” types directly in boolean expressions

当盒装类型 java.lang.Boolean 用作表达式来确定控制流时(如 Java 语言规范 §4.2.5 boolean 类型和布尔值中所述),如果值为 null (如 Java 语言规范 §5.1.8 取消装箱转换中定义),它将抛出 NullPointerException

完全避免此类转换并显式处理 null 值会更安全。

但请注意,对于已经过 null 检查的布尔值,不会引发任何问题。

相关文章
|
7月前
|
C语言 C++
C++与C强转异同(下)
C++与C强转异同(下)
74 0
|
7月前
|
编译器 程序员 C++
C++与C强转异同(上)
C++与C强转异同
101 0
|
7月前
|
XML 并行计算 Java
反射、枚举和lambda表达式
反射、枚举和lambda表达式
|
6月前
|
Java
java反射-动态调用方法(无参无返回值、有参无返回值、有参有返回值)
java反射-动态调用方法(无参无返回值、有参无返回值、有参有返回值)
|
6月前
|
安全 Java
JAVA反射调用方法
JAVA反射调用方法
函数包装器和lambda表达式
函数包装器和lambda表达式
|
存储 Java 编译器
Java方法重载的本质
Java方法重载的本质
65 0
Java方法重载的本质
|
Java
JAVA反射时(getMethod),参数是数组怎么办?
JAVA反射时(getMethod),参数是数组怎么办?
180 0
|
Java 编译器
java方法的重载要求与作用,重载与重写的区别
java方法的重载要求与作用,重载与重写的区别
278 0