我想用 Java 制作一个像机器人大战这样的小游戏。
这个想法是扩展我的机器人类,并添加自定义规则。
但是,我有很多事情想要阻止程序员做,比如无限循环。
我知道一些编译器会提示如果有无限循环,在 Methode 中需要一个返回值。但我不认为所有编译器都会返回错误,所以我在想是否还有一种方法可以用另一种方式检查这个错误?
或者也许是一种对方法进行某种超时的方法?
更新: 回顾我大约三年半前发布的这个问题,我不再用 Java 进行编程,但仍然是一名活跃的程序员,随着时间的推移,我了解到,如果没有实现审查周期。 没有简单的方法来检查代码是否是恶意的(这就是我们拥有防病毒程序的原因)。
为了做一件我想做的事情,我首先需要控制我正在开发的整个平台,检查代码行为的原因,这是一项几乎不可能完成或太耗时的任务 -消费。
这就是为什么为了更安全地做到这一点,我达到的解决方案是使用一种脚本语言来限制用户的想法。
在服务器上托管一个程序,让每个人都可以添加代码,这根本不是一个好主意。即使使用 Java 和 CIL 等管理程序语言,由于平台不会检查这些细节,因此需要花费太多精力才能做到这一点。
尽管有一种方法可以在 Java 中“沙箱”程序,通过使用 Policies 和 C# 有 something similar ,它永远不会阻止熟练的程序员利用或做一些从未意图的事情。
我希望此更新能够向其他人警告他们正在做的事情,因为我注意到这个主题最近被搜索了很多。
最佳答案
我不确定我是否理解游戏的背景。但我想在回答这个问题时先说,你无法阻止某人编写无限循环,并且一旦无限循环运行,你就无法停止它。只要你的所有代码都是可访问的,并且你返回了你必须的东西等等,Java就不会帮助你检测和防止无限循环。
但是,如果您想在一段时间内执行另一个例程并确保再次访问您的线程,一种方法是通过 Future。
如果您允许“其他编码员”实现 Runnable 或 Callable,那么您可以使用 Future 类的 get(long timeout, TimeUnit unit)使机器人在预定时间段后超时的方法。这将防止另一个线程中的无限循环永远占用您的线程。
但是,需要注意的是,如果另一个机器人有无限循环,即使在您超时后,它也可能永远不会停止运行。 Java 不保证它可以停止其他线程。因此,在代码中调用此类例程时,了解所调用的内容非常重要。
这里是一些使用 Future 的示例代码。
abstract class Robot implements Runnable {
}
class SampleRobot extends Robot {
@Override
public void run() {
while (!Thread.interrupted()) {
}
}
}
class RobotRunner {
ExecutorService executorService = Executors.newSingleThreadExecutor();
public void runRobot(Robot robotToRun) throws InterruptedException, ExecutionException {
Future<?> robotFuture = executorService.submit(robotToRun);
try {
robotFuture.get(5, TimeUnit.SECONDS);
} catch (TimeoutException e) {
// This is where you would handle the timeout occurring.
}
}
}
请记住,您不应期望 Java 中的超时具有实时行为。使用完 ExecutorService 后还记得将其关闭。
关于java - 防止java中的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20992111/