如果我的Java源文件中存在语法错误,为什么Eclipse会生成.class文件?

时间:2013-08-21 04:59:15

标签: java eclipse

当我使用Eclipse IDE创建项目时,即使我的代码中存在语法错误,它也会生成一个类文件?

class Test {    
    public void test(String value) {
        System.out.println("TEST CALLED WITH VALUE " + value);
    }
}

class Abc {
    Test obj = new Test();      
    public String firstCallToMethodFromTest() {
        System.out.println("FIRST CALL TO THE METHOD FROM TEST CLASS");
        String result = obj.test("TEST");
        return result;
    }

    public String secondCallToMethodFromTest() {
        System.out.println("SECOND CALL TO THE METHOD FROM TEST CLASS");
        String result = obj.test(); 
        // There is no such method in test class i.e source code error
        return result;
    }       
}

方法firstCallToMethodFromTest被我的Struts动作称为动作方法。 Eclipse如何编译我的源代码文件中存在语法错误的Abc类的代码?

3 个答案:

答案 0 :(得分:9)

有一个原因。它允许运行具有编译错误的应用程序(有点!)。编译器所做的是为源代码中的错误导致无法编译的任何方法创建存根方法。如果应用程序调用其中一个存根方法,则会出现运行时异常,指出该方法存在编译错误。

IMO,这个“功能”主要是有害的 ......对于Eclipse新手而言,它可能会非常混乱。但是,对于想要在部分编写的类上运行测试等的人来说,它会很有用。

IIRC,“运行”对话框中有一个复选框,允许您启用/禁用运行具有编译错误的应用程序。 (我总是禁用它!)

<强>更新

此行为是特定于Eclipse的。它由“窗口&gt;首选项&gt;运行/调试&gt;启动”首选项面板中的setting控制。

答案 1 :(得分:4)

因为您可以运行和调试仅部分编译的类,只要您只浏览编译时没有错误的代码部分。如果您的控制流来到了编译错误的地方,则会在运行时发生异常。

请记住,如果您在调试期间直接更改了代码(热代码替换):许多IDE甚至会警告您,在某些情况下,您正在部分删除现有代码,但您仍希望继续完全相同的调试会话,因此这个功能真的很需要。

答案 2 :(得分:2)

这是一个名为增量Java编译的Eclipse特定功能。

它是JDT Core的一部分。 JDT Core是Java IDE的Java基础结构。

  • An incremental Java compiler:作为Eclipse构建器实现,它基于从VisualAge for Java编译器演化而来的技术。 In particular, it allows to run and debug code which still contains unresolved errors.

这就是为什么你可以看到编译器.class文件的原因。

But how can i run a partially compiled code ? 

只要具有错误的方法不是执行流程的一部分,您就可以运行它。尽管如此,当jvm尝试执行有错误的方法时,jvm只会关闭终止你的程序。