1

是否可以在编译时进入无限循环?

当我尝试编译时,我的程序似乎进入了无限循环。我有一个带有类构造函数的类,它调用方法 gameRun()。gameRun() 在执行结束时调用自己,但应该有适当的检查才能在运行时中断它......但是当我尝试编译该类时,我实际上似乎得到了一个无限循环。

我对编译的理解是它实际上并没有执行代码......这意味着除非编译器的源代码中确实存在严重的错误,否则不可能进入无限循环。它是否正确?

我正在用 Java 编写代码,并且正在使用 BlueJ(我正在从中成长的初学者 IDE)作为我的 IDE。

提前致谢。

.....................................

感谢大家提供这么多有用的回复。只是想我会发布一个更新,因为这似乎引起了一些兴趣,我自己也很好奇。

自从我发布原始错误以来,我并没有对 BlueJ 或这个错误做很多事情,因为我已经从项目中获取了源文件,并且能够成功地用 eclipse 编译和运行它们。这向我表明这是一个 BlueJ(或相关)问题。我继续使用 eclipse 进行这个项目,没有任何这种性质的问题。当我能够再次使用带有原始项目的机器时,我将跟进有关该问题的更多详细信息。(从那以后什么都不应该改变)

.....................................

作为事后的想法......有什么办法可以将此问题链接到自发布以来我创建并注册的帐户?我找不到一种方法来做到这一点,它会使跟踪这个更方便......

4

7 回答 7

7

某些语言确实允许编译器进入无限循环。Java 不是这些语言之一。:-)

于 2009-10-07T22:12:44.577 回答
4

您是对的,编译器不执行代码,并且只会由于错误而进入无限循环。我相信javacSun 的编译器没有这样的错误。

我不知道 BlueJ 在“幕后”使用的是什么编译器,但是当 Ant 运行时我看到了一个问题,javac这使得编译需要长时间。简单地说,在某些情况下,Ant 会指示编译器加载给定目录下的每个类。如果该目录包含数百个第三方库,则可能需要一段时间……甚至内存不足。

于 2009-10-07T22:18:56.410 回答
2

如果您只使用javac ,您的编译是否会挂起(循环) ?

在编译 Java 时,我从未见过编译无限期挂起,我想知道 BlueJ 是否有问题。

于 2009-10-07T22:14:37.367 回答
1

如果 BlueJ 确实使用了自己的编译器,您可能已经在其中或围绕它的 BlueJ 构建工具中发现了一个错误。

您可能会对此采用BinaryChop方法:将您的程序分解为多个部分,单独编译它们,并查看是否可以将编译器挂起行为隔离到一个小的特定测试用例。在一天结束时,您要么有一个出色的错误报告向 BlueJ 人员展示,要么您会发现您的程序确实可以编译(但您会摸不着头脑)。

于 2009-10-07T22:19:51.630 回答
1

AFAIK,标准 Java 不能无限编译。

您确定问题出在编译而不是 BlueJ 提供的其他功能上吗?许多基于 Eclipse 的 IDE 在重建期间执行多个操作,而编译只是其中之一。有可能是别的东西。

你到底看到了什么?一个无休止的 Eclipse 任务?

于 2009-10-07T22:21:56.977 回答
1

例如,如果要编译一个文件,编译器首先必须完成对该文件的编译,理论上是可以做到的。(啊……递归)。但我想检查这种疯狂将是现实世界的编译器要处理的第一件事。

但我认为它不会发生在方法/函数上,除非(假设)编译器试图将尾递归解析为更简单的实现,但失败了。但是,我再次无法想象现代 Java 编译器会出现问题,即使它根本存在。当然我会想象编译器最终会放弃并发布错误而不是无限循环。

它更有可能是 IDE 而不是编译器猜测一下,IDE 可能会尝试将警告/错误跟踪到代码中的源代码,以突出显示它并被困。BlueJ 是否有关于编译器错误/警告的文本​​突出显示?你可以试试关掉。

虽然,正如许多其他人已经建议的那样,第一个真正的测试是从命令行编译使用

javac *.java

或者您的代码使用的任何文件。

编辑:对不起,我从来没有回复过你。为了将来参考,从命令行编译(我假设 Windows 作为你的操作系统):

  1. 通过转到开始菜单打开命令行并选择运行...
  2. 在“运行”对话框中键入 cmd,然后单击“确定”。
  3. 这应该会打开一个 cmd.exe 控制台。
  4. 从这里,使用“cd”命令将目录更改为包含您的 java 文件的目录。(cd "我的文档\Java\Monster Battle\core")
  5. 进入正确的目录后,键入“javac *.java”。这将运行编译器而无需处理 IDE。它应该在编译时暂停,完成后,您会返回命令提示符。
  6. 如果你输入“javac *.java -verbose”你会得到完整的输出,以防你得到你的无限循环。

如果这工作正常,这是一个 IDE 错误。向他们发送错误报告。如果没有,恭喜!您发现了一些非常有趣的东西,它可能会让一些可怜的 Sun 开发人员呆上一个月。

于 2009-10-07T22:22:30.137 回答
0

尝试使您正在编译的源代码尽可能小,并且仍然表现出您描述的行为。这样做的过程可能会帮助您确定问题所在。

于 2009-10-07T22:29:13.857 回答