Why does if(Boolean.TRUE) {...} and if(true) {...} work differently in Java(为什么 if(Boolean.TRUE) {...} 和 if(true) {...} 在 Java 中的工作方式不同)
问题描述
我想知道 if
子句中 Boolean.TRUE
和 true
值之间的区别.当我使用 Boolean.TRUE
而不是 true
时,为什么它会给我一个编译错误(可能尚未初始化一个值).
I want to know the difference between Boolean.TRUE
and true
values inside an if
clause. Why does it give me a compilation error (that a value may not have been initialized) when I use Boolean.TRUE
instead of true
.
下面是我的代码:
public class Test {
public void method1() {
int x;
if(Boolean.TRUE) {
x = 200;
}
System.out.println("x: " + x); // Compilation error
}
public void method2() {
int x;
if(true) {
x = 200;
}
System.out.println("x: " + x); // Compiles fine
}
}
推荐答案
简答
对于 if (true)
,编译器可以推断出 x
在被读取之前已经被初始化.这不适用于 if (Boolean.TRUE)
情况.
Short answer
For if (true)
the compiler can deduce that x
has been initialized before it's being read. This does not hold for the if (Boolean.TRUE)
case.
正式回答:
所有局部变量在被读取之前必须有一个明确的赋值 (14.4.2. 局部变量声明的执行):
[...] 如果声明器没有初始化表达式,那么每次对变量的引用都必须在执行对变量的赋值之前,否则会发生编译时错误根据第 16 条的规则.
[...] If a declarator does not have an initialization expression, then every reference to the variable must be preceded by execution of an assignment to the variable, or a compile-time error occurs by the rules of §16.
在这种情况下,在引用变量之前的代码中包含 if
语句,因此编译器会执行一些流分析.但是,正如 第 16 章.明确分配一个>:
In this case there's an if
statement involved in the code preceding the reference to the variable, so the compiler performs some flow analysis. However, as spelled out in Chapter 16. Definite Assignment:
除了条件布尔运算符&&
、||
和的特殊处理?:
和 布尔值常量表达式,流分析中不考虑表达式的值.
Except for the special treatment of the conditional boolean operators
&&
,||
, and? :
and of boolean-valued constant expressions, the values of expressions are not taken into account in the flow analysis.
所以由于 true
是布尔值 常量表达式 和 Boolean.TRUE
(这是对堆上的值的引用,受自动拆箱等影响)不是它遵循
So since true
is a boolean-valued constant expression and Boolean.TRUE
(which is a reference to a value on the heap, subject to auto-unboxing etc) is not it follows that
if (true) {
x = 200;
}
产生x
的明确赋值,而
if (Boolean.TRUE) {
x = 200;
}
没有.
这篇关于为什么 if(Boolean.TRUE) {...} 和 if(true) {...} 在 Java 中的工作方式不同的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:为什么 if(Boolean.TRUE) {...} 和 if(true) {...} 在 Java 中的工作方式不同
基础教程推荐
- 设置 bean 时出现 Nullpointerexception 2022-01-01
- FirebaseListAdapter 不推送聊天应用程序的单个项目 - Firebase-Ui 3.1 2022-01-01
- 无法使用修饰符“public final"访问 java.util.Ha 2022-01-01
- 减少 JVM 暂停时间 >1 秒使用 UseConcMarkSweepGC 2022-01-01
- 在 Libgdx 中处理屏幕的正确方法 2022-01-01
- Java:带有char数组的println给出乱码 2022-01-01
- Java Keytool 导入证书后出错,"keytool error: java.io.FileNotFoundException &拒绝访问" 2022-01-01
- 降序排序:Java Map 2022-01-01
- “未找到匹配项"使用 matcher 的 group 方法时 2022-01-01
- 如何使用 Java 创建 X509 证书? 2022-01-01