当前位置: 首页 > 知识库问答 >
问题:

“错误:变量a可能尚未初始化”在这个if构造中真的有必要吗?

堵凯
2023-03-14

我如何告诉Java,我不需要初始化a就可以有一个工作程序,并且不给我一个错误?

int a;
boolean b = true;
while (true) {
   if (b == false) {
       System.out.print(a);
       break;
   } else {
       b = false;
       a = 5;
   }
}

如果我不能,有什么原因可以解释为什么编译器是这样设计的吗?

设计这样的编译器容易吗?还是这是一种确保我重新构造代码的机制?

这和这个问题不一样

共有1个答案

殷承恩
2023-03-14

“错误:变量a可能尚未初始化”在这个if构造中真的有必要吗?

是的,这是必要的。Java语言规范需要它。这在JLS 16-明确分配中有介绍。

“每个局部变量(§14.4)和每个空白的最终字段(§4.12.4,§8.3.1.2)在访问其值时必须有一个明确的赋值。”

我如何告诉Java,我不需要初始化a就可以有一个工作程序,并且不给我一个错误?

你不能这么说。你需要初始化变量。。。或者重组代码。

如果我不能,有什么原因可以解释为什么编译器是这样设计的吗?

因为Java编译器必须实现规范,否则它不是一个合适的Java编译器。规范说那是一个错误。

真正的问题是为什么规范会这么说。答案是,编译器编写人员不必被迫在所有Java编译器中包含难以证明定理的代码。

>

  • 在你给出的例子中,对于程序员来说,变量总是会被初始化的,这是显而易见的。但是,编译器需要验证它。它需要绝对确定,因为未初始化的变量会有未定义的行为。

    自动(无定向)验证是一项复杂的任务。复杂意味着要写更多的(编译器)代码,更多的(编译器)错误,等等。

    这项技术中的“最先进”还达不到对复杂的Java代码做这种分析。

    在(理论上)有些情况下,验证变量是否初始化在数学上是不可能的。

    因此...明智地...指定Java语言的人将此推回给程序员。您需要编写代码,以便根据JLS中规定的规则,在使用之前确定分配变量。

    还有第二个原因。假设JLS确实允许Java编译器接受

       System.out.print(a);
    

    当且仅当它能够满足a之前(始终)已初始化。现在考虑两个不同的人编写的java编译器(或者在不同时间的同一个人)来实现JLS的相同版本。

    >

    编译器C2无法确定a始终是初始化的,并表示程序无效。

    我们现在有两个Java编译器,表面上实现了相同版本的JLS,但对示例程序(上图)是否有效存在分歧。这根本站不住脚。

    让事情进一步复杂化的是,我怀疑当JVM验证刚刚加载的字节码时,也必须进行类似于“确定分配”检查的操作。因此,对JLS明确分配规则的更改将波及JVM,并可能影响其他编程语言和工具的JVM平台行为,这些语言和工具直接编译/生成JVM字节码。

  •  类似资料:
    • 问题内容: 当我尝试编译时: 我得到这些错误: 在我看来,我在方法的顶部初始化了它们。怎么了 问题答案: 你声明了它们,但没有初始化它们。初始化它们是将它们设置为等于一个值: 因为未初始化变量,但在循环中增加了变量(例如),因此会收到错误消息。 Java原语具有默认值,但如下一位用户所述 当声明为类成员时,它们的默认值为零。局部变量没有默认值

    • 问题内容: 我有一个方法创建一个,另一个方法更改字符串 我的编译器说它“可能尚未初始化”。 有人可以解释吗? 问题答案: 变量可能尚未初始化 在内部定义方法时,必须在其中初始化程序的每个变量中必须先使用一个值的地方。 同样重要的是,您的代码将永远无法正常运行,因为Java中的字符串是不可变的,因此您无法编辑字符串,因此应更改方法。 我将您的代码更改为类似的内容,但是我认为您的编辑方法应该做另一件事

    • 我不知道这段代码有什么问题,也不知道为什么会出现错误: 变量isPrime可能尚未初始化 这是完整的代码:

    • 我创建了包含构造函数和toString方法的类主管。但是,当我试图打印数组的索引时,出现了一个错误,“变量svArray可能尚未初始化。我该如何解决这个问题?”?

    • 所以我已经在结果中声明了相关字符串的值,但是它仍然说我的变量“result”可能还没有初始化。 我正在尝试实现与此类似的输出。任何人都可以帮我吗?谢谢!

    • 我正在研究Euler Problem 9项目,其中说明: 毕达哥拉斯三元组是由三个自然数组成的集合 例如,3^2 4^2=9 16=25=52。 确实存在一个毕达哥拉斯三重态,其bc=1000。查找产品abc。 以下是我到目前为止所做的: 当我运行代码时,会出现以下错误: 注意:我的每个变量(a、b和c)都有不同的行号。 我想当我声明a、b和c为整数时,如果不赋值,默认值是0。 即使不是这样,在我