为什么编译器没有捕获此错误?

时间:2011-04-04 17:11:51

标签: java

当我在一个死线程上调用start方法时,我在运行时得到java.lang.IllegalThreadStateException,但编译顺利。

class Foo implements Runnable {

    public void run() {

    }

    public static void main(String [] args) {
        Runnable r = new Foo();
        Thread t = new Thread(r);

        t.start();
        t.start();
    }
}

我的问题是为什么Java编译器没有捕获到这样的错误?

2 个答案:

答案 0 :(得分:7)

因为这是一个语义错误。句法和语义错误之间的界限是模糊的,但一般来说,捕捉所有语义错误是不可能的(参见halting problem),因此语言设计者和编译器编写者必须在保护程序员与自己之间进行权衡并进行足够快速的编译。 / p>

要捕获此特定错误,编译器需要了解线程库的语义。它没有,因为Java中的线程被设计为库的一部分,而不是语言的一部分。

答案 1 :(得分:2)

因为它不是语法错误或类型错误。它是一个运行时错误。这是因为编译器不理解每个方法的工作方式的约束。

即使是大多数代码分析器也不会将其视为错误。

但是,如果你编写一个简单的单元测试或运行程序,那么错误就会很明显。