我现在正在学习java编程课程,这是我第一次真正的编程经验(虽然我之前做过一些编程)。对于类我必须使用jEdit编写程序,并使用终端来编译和运行它们(我有一个mac,自动编译,运行和调试程序的程序被禁止用于教育目的)。一开始事情进展顺利,但几天前,当我尝试编译它时,终端停止覆盖我的QuickSort程序上的.class文件。我改变代码,使其在运行时看起来完全不同,但在编译并运行之后,没有任何变化。但是,如果我在重新编译之前删除.class文件,则下次运行时会执行更改。我和我的老师都没有能够找到关于这个问题的任何信息或如何解决它(在我发生故事之前三天,我的同学发生了同样的事情,我们是班上唯一的mac用户)。如果有人知道问题是什么,如何修复它,或者我找到了解如何修复它的人,我会非常感激。每次编译我的程序时删除五个.class文件是一个巨大的痛苦,并已经导致了一些严重的问题。非常感谢你的帮助!
*编辑:我正在运行mac os x 10.8.5
答案 0 :(得分: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
并且不会重新编译它。