当前位置: 首页 > 面试题库 >

为什么if(Boolean.TRUE){…}和if(true){…}在Java中的工作方式不同

司徒耀
2023-03-14
问题内容

我想知道子句中Boolean.TRUEtrue值之间的区别if。当我使用Boolean.TRUE而不是时,为什么会给我一个编译错误(一个值可能尚未初始化)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)如此。

正式答案: 在读取之前,
所有局部变量都必须有一个 确定的赋值
(14.4.2。局部变量声明的执行):

[…]如果声明符没有初始化表达式, 则对变量的每次引用都必须在对变量的赋值之前执行 ,否则第16条的规则会发生编译时错误。

在这种情况下if,在变量引用之前的代码中包含一条语句,因此编译器执行一些流分析。但是,如第16章所述。明确分配:

除了对条件布尔运算符&&||? :布尔值常量表达式 的特殊处理外,在流分析中不考虑 表达式 的值。

因此,由于true是一个布尔值常量表达式,并且Boolean.TRUE(它是对堆中值的引用,因此需要自动拆箱等),因此它不是

if (true) {
    x = 200;
}

产生xwhile 的明确分配

if (Boolean.TRUE) {
    x = 200;
}

才不是。



 类似资料:
  • 为什么在Python中比慢?难道不应该比快吗? 我试图学习模块。从基础开始,我尝试了这些: null 注意:我运行三次,取结果的平均值,然后将时间和代码一起张贴在这里。 这个问题与如何做微基准测试无关(我在这个例子中做了,但我也明白它太基础了),而是为什么检查一个‘真’变量比一个常量慢。

  • 问题内容: PS:我了解“真实”与真实之间的区别。 编辑:我也明白Boolean.TRUE是原始true的包装,然后我的问题是-为什么原始boolean接受Boolean.TRUE作为值?例如, 似乎是一个有效的声明。 问题答案: 原因 之所以 起作用 ,是因为 autounboxing 是Java 5的一项功能,该功能允许包装器对象在需要时自动转换为其等效的原始对象。相反, autoboxing

  • 问题内容: 给出以下代码: 为什么会这样?我以为布尔值会被强制转换为数字。因此变得和变。第二条if语句很有意义,但是我不明白为什么第一条语句导致要评估内部循环。这里发生了什么? 问题答案: 它被强制转换为布尔值。任何非空字符串的求值为true。 根据[ECMAScript语言规范]: ## 12.5 声明 ### 语义学 生产 IfStatement : Expression Statement

  • 为什么以下输出为True? 这将始终输出,即使条件似乎表明并非如此。如果我删除括号,那么它可以工作,但我不明白为什么。

  • 问题内容: 当用于运行“ ”(仅作为示例)时,在Windows上我们得到以下信息: 因此,可以按照我的期望很好地打印出该版本。但是在Linux上,我们得到以下信息: 因为gcc尚未收到该选项。 文档没有明确指定Windows下的args应该发生什么,但是它确实说在Unix上, “如果args是一个序列,则第一项指定命令字符串,任何其他项都将被视为其他shell参数。 。” 恕我直言,Windows

  • 问题内容: 今天,我刚刚发现了一个问题,因为我的一个单元测试由于从Java 7升级到Java 8而失败了。该单元测试调用一个方法,该方法试图在子类上注释的方法上找到注释,但返回类型不同。 在Java 7中,似乎只有在代码中确实声明了注释时,才会找到注释。在Java 8中,似乎包含在子类中声明的注释。 为了说明这一点,我创建了一个简单的(??)测试类IAPTest(用于IsAnnotationPre