有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

当我使用EclipseIDE创建项目时,即使代码中有语法错误,它也会生成一个类文件

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) 个答案

  1. # 1 楼答案

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

    依我看,这个“特征”是有害的。。。对于Eclipse新手来说,这可能会非常混乱。但是,对于希望在部分编写的类上运行测试等的人来说,它可能很有用

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

    更新

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

  2. # 2 楼答案

    它是一种特定于Eclipse的特性,称为增量Java编译

    它是JDT Core的一部分。JDT核心是JavaIDE的Java基础设施

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

    这就是为什么你可以看到编译器。类文件

    But how can i run a partially compiled code ? 
    

    只要有错误的方法不是执行流的一部分,就可以运行它。尽管如此,当jvm试图执行出现错误的方法时,jvm会在终止程序时简单地关闭

  3. # 3 楼答案

    因为您可以运行和调试仅部分编译的类,只要您只遍历编译后没有错误的代码部分。如果您的控制流出现编译错误,则在运行时会发生异常

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