自动拆箱调用方法原理

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

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

我们一般使用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 检查的布尔值,不会引发任何问题。

目录
打赏
0
0
0
0
29
分享
相关文章
Java反射,枚举讲解
Java反射,枚举讲解
99 0
|
5月前
|
方法重载和方法重写有什么区别?
本文解释了Java中方法重载(Method Overloading)和方法重写(Method Overriding)的区别,包括它们的定义位置、参数要求、返回值要求、业务功能以及绑定方式的不同,并提供了示例代码。
95 2
方法重载和方法重写有什么区别?
|
8月前
|
Java面向对象 ( 类与对象 | 构造方法 | 方法的重载 )
Java面向对象 ( 类与对象 | 构造方法 | 方法的重载 )
|
9月前
|
java反射-动态调用方法(无参无返回值、有参无返回值、有参有返回值)
java反射-动态调用方法(无参无返回值、有参无返回值、有参有返回值)
110 0
JAVA反射调用方法
JAVA反射调用方法
|
10月前
|
认真学习JVM的方法调用(方法重载和重写)
认真学习JVM的方法调用(方法重载和重写)
51 0
获取java泛型类中的泛型类型
实现java中获取泛型类中的泛型类型的方法
282 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等