编译时无限循环?

时间:2009-10-07 22:11:00

标签: java infinite-loop compile-time

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

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

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

我正在用Java编写,并且正在使用BlueJ(我正在发展的初学者的IDE)作为我的IDE。

提前致谢。

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

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

由于我发布了原始错误,因为我已经从项目中获取了源文件,并且能够使用eclipse成功编译并运行它们,所以我没有完成很多BlueJ或这个错误。这告诉我,这是一个BlueJ(或相关)问题。我继续使用eclipse处理这个项目而没有任何更多这种性质的问题。当我能够再次使用原始项目的机器时,我将跟进有关该问题的更多细节。 (自那以后什么都不应该改变)

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

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

7 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:4)

你没错,编译器不执行代码,只会因为bug而进入无限循环。我相信Sun的javac编译器没有这样的错误。

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

如果BlueJ确实使用了自己的编译器,您可能会在其中找到错误,或者在BlueJ的构建工具中找到它。

您可以对此进行BinaryChop方法:将程序分解为多个部分,单独编译它们,并查看编译器挂起行为是否可以隔离到一个小的特定测试用例。在一天结束时,你会有一个很好的错误报告来显示BlueJ的人,或者你会发现你的程序实际上已编译(但你会摸不着头脑)。

答案 4 :(得分:1)

AFAIK,标准Java无法无限编译。

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

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

答案 5 :(得分:1)

理论上,如果编译文件,理论上可以做,编译器首先必须完成编译该文件。 (啊......递归) 但是我想象一下,检查这种疯狂是现实编译器能够处理的第一件事。

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

比编译器更可能是IDE。猜测,IDE可能会尝试在代码中跟踪警告/错误,以突出显示它并陷入困境。 BlueJ是否对编译器错误/警告进行了文本突出显示?您可以尝试将其关闭。

尽管正如许多其他人已经建议的那样,第一个真正的测试是使用

从命令行进行编译
javac *.java

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

编辑:抱歉,我再也没有回复你。为了将来参考,从命令行编译(我假设Windows作为您的操作系统):

  1. 转到开始菜单,然后选择运行...
  2. 打开命令行
  3. 在“运行”对话框中键入cmd,然后单击“确定”。
  4. 这应该会显示一个cmd.exe控制台。
  5. 从这里,使用“cd”命令将目录更改为包含java文件的目录。 (cd“My Documents \ Java \ Monster Battle \ core”)
  6. 进入正确的目录后,输入“javac * .java”。这将运行编译器而无需处理IDE。它应该在编译时暂停,当它完成时,你会得到命令提示符。
  7. 如果您输入“javac * .java -verbose”,您将获得完整输出,以防您获得无限循环。
  8. 如果工作正常,那就是IDE错误。向他们发送错误报告。如果没有,恭喜!你发现了一些非常有趣的东西,可能会让一些可怜的Sun开发人员陷入困境一个月。

答案 6 :(得分:0)

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