2

我有这段简单的代码:

@Override
public Object call() throws Exception {
    try (Connection conn = ConnectionPool.getConnection()) {
        pageDAO = new PageDAO(conn);
        linkDAO = new LinkDAO(conn);
        loopInsertion();
    }
    return true;
}

我得到了一个SQLException方法getConnection()。如果我放 a catch,则在块中捕获异常,但如果没有,则不会提前抛出异常,但不会发生错误。似乎它已被锁定并且无法继续执行代码。

为什么会有这种行为?我误解了什么?这不是预期的吗?

4

1 回答 1

2

我猜测您未显示的代码,但如果这是您使用ExecutorService调用的 Callable ,则在 Callable 代码中发生的任何异常都不会传播到任何地方,直到您调用其中一个 get( )在提交 Callable时返回的 Future方法。当你调用 get() 时,它会抛出一个 ExecutionException,其根本原因是你的代码抛出的异常。

更简单地说,当您使用 ExecutorService 将代码分叉到另一个线程时,该代码引发的任何异常都会被捕获并保留,直到您返回并询问运行代码的结果。如果你从不这样做,那么异常就会消失。

于 2011-10-21T03:10:29.993 回答