2013-11-23 15 views
1

我現在正在參加一個java編程課,這是我第一次真正的編程經驗(雖然我已經做了一些編程)。對於類我不得不使用jEdit編寫程序,終端編譯和運行它們(我有一個mac,程序自動編譯,運行和調試程序被禁止用於教育目的)。起初我的工作進展順利,但幾天前,終端在我嘗試編譯QuickSort程序時停止覆蓋.class文件。我改變了代碼,使它在運行時看起來完全不同,但是在我編譯並運行它之後,沒有任何改變。但是,如果我在重新編譯之前刪除.class文件,則下次運行時會執行更改。我和老師都無法找到關於這個問題的任何信息,或者如何解決這個問題(在我發生的三天前,我的同班同學也發生了同樣的事情,而且我們是全班唯一的Mac用戶)。如果有人知道問題是什麼,如何解決問題,或者我可以找到一個知道如何解決問題的人,我會非常感激。每次我編譯我的程序時刪除五個.class文件是一個巨大的痛苦,已經導致了一些嚴重的問題給我。非常感謝你的幫助!終端不覆蓋.class文件

*編輯:我正在運行的Mac OS X 10.8.5

+3

您能否至少列出您執行的命令以及提供源(和/或目標)目錄的簡要提綱? – afk5min

+1

段落......當你希望其他人閱讀你寫的東西時,最好花點力氣讓他們閱讀它。文字牆將會讓很多潛在的回答者失望。 – hyde

+0

我使用這些命令。 RandomArray類只是一個測試類,它創建一個隨機數組然後調用排序程序本身。編譯該類會編譯所有必需的類(至少,在出現此問題之前):「cd desktop/programs/multisorter」和「javac RandomArray」。java「 –

回答

1

編譯器是不是檢測哪一個類文件已過時的足夠聰明,那麼可以手動告訴它使用javac *.java重新編譯所有或使用構建工具如Ant


原因編譯器不重新編譯所有的類是,它試圖成爲「智能」,並通過僅更改重新編譯文件,避免不必要的工作。如果.class文件比匹配的.java文件更新,則源代碼自上一次編譯以來未更改,因此該類不會重新編譯。

當有多個文件具有一系列依賴關係時,這可能會導致問題。考慮一個簡單的例子:

// file: A.java 
public class A { public static void main(String[] args) { new B().run(); } } 

// file: B.java 
public class B { void run() { new C().run(); } } 

// file: C.java 
public class C { void run() { System.out.println("hello world"); } } 

A被編譯,第一次,編譯器看到它引用B,這反過來又引用C。所有這三個都編譯完成,一切都很好。

如果B.java修改和A被重新編譯,編譯器看到的是A引用B既然B.java較新,B.class它被重新編譯。它不會重新編譯C,因爲C.java尚未更改。一切都還好。

但如果C.java被修改和A被重新編譯編譯器看到的是A取決於B,但由於B.java並沒有改變它沒有重新編譯。所以編譯器永遠不會去C,即使C.java已更改,也不會重新編譯它。

+0

非常感謝你!你讓我的生活變得更輕鬆! –