java - 防止java中的无限循环

标签 java frameworks infinite-loop

我想用 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/

相关文章:

java - 将包含 3DES key 的 Java JCEKS keystore 转换为 PKCS12

frameworks - IoTivity 与 AllJoyn - 有什么区别?

iphone - 无法将私有(private)框架添加到项目。它说找不到框架

qt - MacOS Qt 上包含 SDL 框架

c++ - 当对象陷入无限循环时被销毁会发生什么?

java - 无法解决 Android 中的符号 "response"错误

java - 如何按枚举的顺序对 List<Enum, Collection> 进行排序?

algorithm - 无限循环 : Determining and breaking out of Infinite loop

java - 以下代码片段中 this() 的用途是什么?

javascript - 通过 DOM 中的前置元素无限循环