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

标签 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的过程中发生异常,我将打印堆栈跟踪并结束游戏。如果我不这样打印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/

相关文章:

java - 使用递归java的数字总和

java - 反射和运行时类获取方法

java - 什么是NullPointerException,我该如何解决?

python - MySQL : IndexError: tuple index out of range

python - traceback.print_stack() 使用 IPython 的 ultratb

java - 为什么我的 onPrepareOptionsMenu 没有被调用?

python - 为什么在没有Except block 的情况下Python仍会引发异常?

java - 如何在没有 JOptionPane 的情况下在 Java 中创建自定义错误弹出消息?

ios - 如何阅读此 iOS 堆栈跟踪?

python - 改进 python 中的堆栈跟踪钩子(Hook)