2013-08-21 37 views
6

當我使用Eclipse IDE創建項目時,即使在代碼中存在語法錯誤時,它也會生成類文件?如果我的Java源文件中存在語法錯誤,爲什麼Eclipse會生成.class文件?

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類編譯代碼?

+0

它不是來自以前版本的舊'class'文件嗎? – MadProgrammer

+0

不,它不! –

+0

這是eclipse編譯器的一個特性,不是bug! –

回答

9

有一個原因。它允許運行編譯錯誤的應用程序(有點!)。編譯器所做的是爲任何由於源代碼中的錯誤而無法編譯的方法創建存根方法。如果應用程序調用其中一個存根方法,則會得到一個運行時異常,說明該方法存在編譯錯誤。

國際海事組織,這個「功能」是大多是有害的 ...它可能是非常混亂的Eclipse新手。但是,對於想要在部分書面課程中進行測試等的人員可能很有用。

IIRC,運行對話框中有一個複選框,允許您啓用/禁用正在運行的編譯錯誤的應用程序。 (我一直禁用它!)

UPDATE

這種行爲是Eclipse的具體。它由「窗口>首選項>運行/調試>啓動」首選項面板中的setting控制。

+0

此功能在哪裏。以前從未遇到過。有沒有旗幟?對我來說,它總是給編譯本身帶來錯誤。它是IDE的特定功能嗎? –

+0

是的,我記得看到編譯中的對話框**錯誤。所以你仍然希望運行?**自從我轉向Intellij IDEA以來從未遇到它。 –

4

因爲您可以運行和調試僅部分編譯的類,只要您只移動編譯時沒有錯誤的代碼部分即可。如果控制流到達編譯錯誤的地方,運行時會發生異常。只需記住,如果您在調試過程中直接更改了代碼(熱代碼替換):許多IDE甚至會警告您,在某些情況下,您將部分刪除現有代碼,但仍希望繼續完全相同的調試會話,所以這個功能真的很需要。

+0

你是什麼意思,部分編譯?據我瞭解,解釋器/調試器只有在java編譯器編譯完成後才被調用。 –

+0

「部分編譯」是指空間而非時間。因此,並非所有方法都已編譯完成,但編譯過程本身已完成,當然。 – Bananeweizen

+0

但我如何運行部分編譯的代碼? – User2228

2

這是一個Eclipse特定功能,稱爲增量Java編譯

它是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文件。

​​

只要發生錯誤的方法不是執行流程的一部分,就可以運行它。當jvm嘗試執行出現錯誤的方法時,jvm將簡單地關閉終止程序。

相關問題