是否可以在编译时输入无限循环?
当我尝试编译它时,我的程序似乎进入了无限循环。我有一个类,其构造函数调用方法gameRun()。 gameRun()在执行结束时调用自身,但是应该有适当的检查以便能够在运行时中断它...但是当我尝试编译类时,我实际上似乎得到了一个无限循环。
我对编译的理解是它实际上并没有执行代码......这意味着除非编译器源中存在严重的错误,否则无法进入无限循环。这是对的吗?
我正在用Java编写,并且正在使用BlueJ(我正在发展的初学者的IDE)作为我的IDE。
提前致谢。
.....................................
感谢大家提供了这么多有用的回复。只是觉得我发布了一个更新,因为这似乎引起了一些兴趣,我自己很好奇。
由于我发布了原始错误,因为我已经从项目中获取了源文件,并且能够使用eclipse成功编译并运行它们,所以我没有完成很多BlueJ或这个错误。这告诉我,这是一个BlueJ(或相关)问题。我继续使用eclipse处理这个项目而没有任何更多这种性质的问题。当我能够再次使用原始项目的机器时,我将跟进有关该问题的更多细节。 (自那以后什么都不应该改变)
.....................................
作为事后的想法...有没有什么办法可以将这个问题链接到我创建和注册的帐户,因为这个帐号被发布了?我找不到办法做到这一点,它会使跟踪这更方便......
答案 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作为您的操作系统):
如果工作正常,那就是IDE错误。向他们发送错误报告。如果没有,恭喜!你发现了一些非常有趣的东西,可能会让一些可怜的Sun开发人员陷入困境一个月。
答案 6 :(得分:0)
尝试使您编译的源代码尽可能小,并仍然展示您描述的行为。这样做的过程可以帮助您确定问题所在。