代码之家  ›  专栏  ›  技术社区  ›  rahs

“error:variable a may not been initialized”在这个if构造中真的需要吗?

  •  2
  • rahs  · 技术社区  · 6 年前

    如何告诉Java我不需要初始化 a

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

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

    这个问题和 this one

    1 回复  |  直到 6 年前
        1
  •  10
  •   Stephen C    6 年前

    “error:variable a may not been initialized”在这个if构造中真的需要吗?

    是的,这是必要的。Java语言规范需要它。这是在 JLS 16 - Definite Assignment .


    如何告诉Java我不需要初始化 a 有一个工作程序而不给我一个错误?


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

    因为Java编译器 必须

    定理证明 所有Java编译器中的代码。

    • 未定义

    • 这种技术的“最新水平”不足以对复杂的Java代码进行这种分析。

    • 在(理论上)有些情况下,验证变量是否已初始化是非常困难的 .

    所以。。。明智地。。。指定Java语言的人把这个推给了程序员。你需要编写你的代码以便变量 明确分配 使用前,根据JLS中规定的规则。

       System.out.print(a);
    

    当且仅当 以前(总是)初始化过。现在考虑由不同的人(或者同一个人在不同的时间)编写的两个Java编译器来实现同一版本的JLS。

    • 总是初始化,并表示程序有效。

    • 编译器C2无法理解这一点 总是初始化,并表示程序无效。

    我们现在有两个Java编译器 表面上


    直接编译/生成JVM字节码。