为什么Java编译器一次只报告一种错误?

Moh*_*sal 3 java compiler-construction compiler-errors

我有一个片段

class T{
    int y;
    public static void main(String... s){
        int x;
        System.out.println(x);
        System.out.println(y);
    }
}
Run Code Online (Sandbox Code Playgroud)

这里有两个错误,但在编译时为什么只显示一个错误?

显示的错误是:

non-static variable y cannot be referenced from a static context
    System.out.println(y);
                       ^
Run Code Online (Sandbox Code Playgroud)

但是这个错误呢

variable x might not have been initialized
    System.out.println(x);
                       ^
Run Code Online (Sandbox Code Playgroud)

Gre*_*ill 12

Java编译器在几次传递中编译代码.在每次通过中,检测到某些类型的错误.在您的示例中,javac不会查看是否x可以初始化,直到其余代码实际传递上一个编译器传递.


Ste*_*n C 5

@Greg Hewgill钉了它.

特别是,对变量进行初始化,声明异常,无法访问的代码以及其他一些事情的检查会在稍后的过程中发生.如果早期传递中存在错误,则不会运行此传递.

这是有充分理由的.较早的过程构造一个装饰的解析树,代表编译器理解它的程序.如果之前有错误,那么该树将无法准确表示程序,因为开发人员可以理解它.(它不可能!).如果编译器继续运行后来的传递以产生更多的错误消息,很可能很多错误消息会误解错误的解析树的工件.这只会让开发人员感到困惑.

无论如何,这是大多数编程语言的大多数编译器工作的方式.修复一些编译错误可能导致其他(以前未报告的)错误浮出水面.