gpt4 book ai didi

java - 计划任务永远不会引发异常

转载 作者:行者123 更新时间:2023-12-03 08:55:24 24 4
gpt4 key购买 nike

这个问题在here中可以看作一个整体。尽管链接的帖子解释了此问题,但您不应将其视为重复的文章:它会问一个不同的问题,并且对此不同的问题有一个可以接受的答案。

尽管可以在另一篇文章中阅读该问题,但我也会在这里进行解释:

我正在开发一种可以与AI一起玩的类似蛇的游戏,并专门用于此目的。所有此类AI都应扩展一个名为SnakeLogic的抽象类。所有这些AI都还应驻留在特定文件夹中的独立.jar存档中,主程序可以在其中找到它们并使用类加载器列出它们。

然后,如果所有星星都排成一行,则用户可以从列表中选择自己的AI之一,并使用该AI进行游戏。

现在,我的主程序中有一个方法可以像这样从AI获取下一步操作:

public void startGame(int speed) {        
gameInterface.showWindow();
Runnable moveCmd = () -> {
try {

for (Player player : snakeGame.getPlayers()) {
if (player.isDead()) {
continue;
}

String move = player.getLogicHandler().getMove();

Direction direction = Direction.directionFromString(move);
snakeGame.makeMove(player, direction);
}

gameInterface.getFrame().repaint();
snakeGame.wait(speed);

if (snakeGame.gameOver()) {
stopGame();
}

} catch (Exception ex) {
ex.printStackTrace();
stopGame();
}
};

/* moveSchedule is an instance of ScheduledExecutorService */
moveSchedule.scheduleAtFixedRate(moveCmd, 1000, speed, TimeUnit.MILLISECONDS);
}

我不会太参与上面的代码。但是,我想提请您注意try-catch语句。如您所见,如果在执行 moveCmd runnable的过程中发生异常,我将打印堆栈跟踪并结束游戏。如果我不这样打印stacktrace,或者如果我完全删除try-catch,则在执行该块的过程中发生运行时异常的情况下,我永远不会出错。为什么?是因为它包裹在一个可运行的容器中吗?还要注意, snakeGame.makeMove(player, direction);行在主程序中未调用任何代码; snakeGameSnakeLogic的实例,它位于外部.jar中。

如果删除try-catch,为什么没有出现任何错误?错误是指运行时错误。

最佳答案

由于FutureTask中的以下代码:

 try {
runner = Thread.currentThread();
if (getState() == RUNNING)
callable.call(); // don't set result
runner = null;
return compareAndSetState(RUNNING, 0);
} catch (Throwable ex) {
innerSetException(ex);
return false;
}

因此它正在捕获异常并将其设置为仅在执行Callable.get()时返回

关于java - 计划任务永远不会引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27353954/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com