2012-08-16 57 views
-1

我遇到一個很煩人的問題對我來說,我想象編譯文件FooBar.java:Java編譯器是使用舊版本的源代碼

$ javac的FooBar.java

它編譯sucefully然後我運行它像往常一樣:

$ java的FooBar的< in.txt

我得到了預期的輸出結果,如果我改變源代碼(FooBar.java)來打印其他東西並重新編譯,我會得到與第一次相同的輸出!

這真的讓我很生氣......有沒有javac的緩存?即使我刪除FooBar.class並重新編譯,我也會從早期的源代碼中得到輸出。我發現要解決這個問題的唯一方法是刪除FooBar.java並創建一個名稱不同的新文件(我只是複製代碼),這是有效的。

這個錯誤(?)真的讓我煩惱。我尋找解決方案或解釋爲什麼發生這種情況,但沒有運氣。

這似乎是因爲我沒有使用任何IDE和類路徑指向我的工作文件夾可能與我的問題,但不完全: http://www.coderanch.com/t/519372/java/java/Executing-Old-Code

我想找出是什麼導致這是我不不想做一個新的文件,每次我更新的源代碼...我在Windows上使用Java 1.6.0_27

感謝您的閱讀...

+0

您是如何編譯的?您是否使用Eclipse之類的IDE?對不起,沒有看到「我不使用IDE」。你用什麼命令來編譯?如果您刪除.class文件,會發生什麼情況? – km1 2012-08-16 00:56:48

+0

正如我所說,我正在使用** javac **。如果我刪除.class文件並重新編譯,問題仍然存在......它會編譯舊代碼... – 2012-08-16 00:59:41

+0

刪除類文件,請勿編譯並運行java命令。這將驗證您運行的是與您認爲的不同的類文件。 – km1 2012-08-16 01:02:22

回答

0

該問題不會被緩存。試試這個:

  1. 看看你的FooBar.class文件的時間戳(這是什麼RUN)
  2. 做你的編譯再次的javac ...
  3. 看時間戳記一次。它改變了嗎?如果沒有,你正在編譯到某處。
  4. 其他海報對包裝的評論將解釋這一點。這也可以通過設置/更改課程路徑來解釋
+0

謝謝。這個問題是由於我試圖編譯一個與已經編譯的.jar文件名稱相同的文件。我通過刪除.class文件並運行它來得出這個結論:java -v foobar 我發現正在運行的.class是在.jar中,而不是我通過更改代碼所得到的.class。 已解決問題。 :) – 2012-08-17 17:12:00

+0

@ andre.nunes因此,您的類路徑必須包含該jar文件以及您的工作文件夾,與您的問題中陳述的內容相反。 – EJP 2015-07-03 00:06:30

1

是否有一個包聲明?自您首次編譯它以來,您可能已經放入包裝聲明。如果你有包foo.bar,編譯器會在foo/bar/FooBar.class中創建.class文件,你應該用java foo.bar.FooBar來運行它。如果沒有包,它將創建./FooBar.class,並通過java FooBar運行它。

+0

沒有包,它是一個帶有一些數組操作的簡單類,最後是一個System.out.println()。我剛剛添加了另一個println(),輸出沒有改變 – 2012-08-16 01:15:28

+0

這可能不是OP的問題,但它是我的!謝謝! – jrahhali 2015-07-01 20:08:04