局部变量未初始化,但仍在编译程序

Local variable not initialized, but still program compiling

public class Test {

   public static void main(String[] args) {
       System.out.println("started");
       //func();

   }

   static void func(){
       double d;
       int i;
       System.out.println("d ="+d);
       System.out.println("i ="+i);
   }

}

我知道的事实是局部变量在使用前必须初始化。这里 di 是局部变量。你可以看到我还没有初始化它们。 为什么我还能编译程序,还能运行这个?

如果我取消对 func() 的注释,则会出现编译错误。

如果用javac编译,编译不通过:

stephen@blackbox tmp]$ cat > Test.java
public class Test {

   public static void main(String[] args) {
       System.out.println("started");
       //func();

   }

   static void func(){
       double d;
       int i;
       System.out.println("d ="+d);
       System.out.println("i ="+i);
   }

}
[stephen@blackbox tmp]$ javac Test.java 
Test.java:12: error: variable d might not have been initialized
       System.out.println("d ="+d);
                                ^
Test.java:13: error: variable i might not have been initialized
       System.out.println("i ="+i);
                                ^
2 errors
[stephen@blackbox tmp]$ 

我的猜测是您正在使用 IDE,并且您在过去的某个时候告诉 IDE 可以尝试 运行 一个程序编译错误。这是通过 "compiling" 方法实现的,将编译错误转化为字节码,在调用时会抛出异常。当您注释掉对错误方法的调用时,它不会被调用……自然地……并且不会抛出异常。

但底线是您确实遇到了编译错误。你刚刚告诉 IDE 忽略它。


解决方案很明显。修复编译错误

它不编译。这是我编译的输出:

Test.java:12: error: variable d might not have been initialized
   System.out.println("d ="+d);
                            ^
Test.java:13: error: variable i might not have been initialized
   System.out.println("i ="+i);
                            ^
2 errors