计划任务永远不会抛出异常

时间:2014-12-08 08:21:47

标签: java error-handling stack-trace runnable runtimeexception

这个问题在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);不会调用主程序中的任何代码; snakeGameSnakeLogic的一个实例,它位于外部.jar中。

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

1 个答案:

答案 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()

时返回