这个问题在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期间某处发生异常。如果我不打印这样的堆栈跟踪,或者如果我完全删除了try-catch,那么在执行该块期间运行时异常的情况下我永远不会收到任何错误。为什么?是因为它被包裹在一个可运行的内部吗?另请注意,行snakeGame.makeMove(player, direction);
不会调用主程序中的任何代码; snakeGame
是SnakeLogic
的一个实例,它位于外部.jar中。
如果删除try-catch,为什么不会出现任何错误?错误是指运行时错误。
答案 0 :(得分:0)
由于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()
时返回