为什么代码执行从未进入catch块(java)?

为什么代码执行从未进入catch块(java)?,java,exception,exception-handling,Java,Exception,Exception Handling,我试图从类UserHelper中的方法importUsers抛出(自定义)ImportException。我可以在调试器中看到执行了throw子句,但是调用importUsers方法的方法从未捕获异常 以下是引发异常的方法: public static AccessorValidator importUsers(List<String> data, WebUser actor) throws ImportException { //(irrelevant code remo

我试图从类UserHelper中的方法importUsers抛出(自定义)ImportException。我可以在调试器中看到执行了throw子句,但是调用importUsers方法的方法从未捕获异常

以下是引发异常的方法:

public static AccessorValidator importUsers(List<String> data, WebUser actor) throws ImportException {

    //(irrelevant code removed)

    try {
        isSuccess = insertUserData(st, blocks, db, actor);
    } catch (Exception e) {
        throw new ImportException("Could not insert user on line " + rowCounter);
    }
输出为“test2”,代码执行永远不会到达任何一个catch块。我做错了什么?

也许insertUserData()不会在测试设置中引发任何异常?如果该方法也包含在您的问题中,它会有所帮助…

也许insertUserData()不会在您的测试设置中引发任何异常?如果该方法也包含在您的问题中,则会有所帮助。

如果打印了“test2”,则importUsers()不会引发任何异常

调试器中的行信息可能不准确。尝试在异常的构造函数中放置断点,以查看是否确实创建了该异常。

如果打印了“test2”,则importUsers()不会引发任何异常


调试器中的行信息可能不准确。尝试在异常的构造函数中放置断点,以查看它是否真的被创建。

您确定
insertUserData
确实会引发异常,并且不仅返回真/假布尔值吗?看到调试器步骤到带有“throw”的行并不意味着抛出了什么,因为行信息并不总是完全准确的。

您确定
insertUserData
确实抛出了异常,并且不仅返回了真/假布尔值吗?看到调试器步骤到带有“throw”的行并不意味着抛出了什么,因为行信息并不总是完全准确的。

尝试将方法更改为

try {
    isSuccess = insertUserData(st, blocks, db, actor);
    system.out.print("after insertUserData");
} catch (Exception e) {
    System.out.print("before throwing");
    throw new ImportException("Could not insert user on line " + rowCounter);
}

因此,您可以确保在调试中看到的是实际执行的内容(通过检查控制台),以及insertUserData是否实际引发异常。

尝试将方法更改为

try {
    isSuccess = insertUserData(st, blocks, db, actor);
    system.out.print("after insertUserData");
} catch (Exception e) {
    System.out.print("before throwing");
    throw new ImportException("Could not insert user on line " + rowCounter);
}

因此,您可以确保在调试中看到的是实际执行的内容(通过检查控制台),以及insertUserData是否实际引发异常。

按顺序检查以下内容:

  • 检查断点是否与源代码同步
  • insertUserData()
    根本没有引发异常,请验证它是否应该引发异常。看起来你期待着一些永远不会到来的事情
  • 检查
    ImportException
    在您引用它的两种情况下是否确实是同一个对象

  • 按顺序检查以下各项:

  • 检查断点是否与源代码同步
  • insertUserData()
    根本没有引发异常,请验证它是否应该引发异常。看起来你期待着一些永远不会到来的事情
  • 检查
    ImportException
    在您引用它的两种情况下是否确实是同一个对象
  • 如果输出为“test2”,则肯定不会引发异常

    只是猜测

    有时您的IDE可能与实际执行的源代码不同步,特别是如果您的代码是外部库的一部分。。。如果更改库的代码并且不更新实际的
    类路径
    ,或者如果在调试时发生了更改,那么代码行可能会更改,并且您可能会看到抛出的异常,尽管这并没有真正发生。

    如果输出为“test2”,那么肯定不会抛出异常

    只是猜测


    有时您的IDE可能与实际执行的源代码不同步,特别是如果您的代码是外部库的一部分。。。如果更改库的代码而不更新实际的
    类路径
    ,或者如果在调试过程中发生了更改,则代码行可能会更改,并且您可能会看到抛出的异常,尽管这并没有真正发生。

    尝试捕获抛出的异常和错误的根源,包括:

    try{
            av = UserHelper.importUsers(data, admin);
            System.out.print("test2");
        } catch (ImportException ie) {
            System.out.print("testE");
            returnMessageValue = ie.getMessage();
        } catch (Exception e) {
            System.out.print("testE2");
        } catch (Throwable t) {
            // Here you'll catch *anything* else
            System.out.print("testTE");
        }
    

    尝试捕获一个Throwable,异常和错误的根,使用:

    try{
            av = UserHelper.importUsers(data, admin);
            System.out.print("test2");
        } catch (ImportException ie) {
            System.out.print("testE");
            returnMessageValue = ie.getMessage();
        } catch (Exception e) {
            System.out.print("testE2");
        } catch (Throwable t) {
            // Here you'll catch *anything* else
            System.out.print("testTE");
        }
    

    问题解决了。方法importUsers中的try-catch块似乎被另一个try-catch块包围,该块没有抛出ImportException。所以第一个挡块工作正常,我错过了第二个。

    问题解决了。方法importUsers中的try-catch块似乎被另一个try-catch块包围,该块没有抛出ImportException。因此,第一个挡块工作正常,我刚好错过了第二个。

    确实如此。我提到“我可以在调试器中看到执行了throw子句”;更具体地说,我在调试器中看到,行上的代码抛出了新的ImportException(“无法在行上插入用户”+行计数器);我没有添加insertUserData方法中的代码,因为实际的异常抛出了好几层,所以执行起来很复杂。确实如此。我提到“我可以在调试器中看到执行了throw子句”;更具体地说,我在调试器中看到,行上的代码抛出了新的ImportException(“无法在行上插入用户”+行计数器);我没有添加insertUserData方法中的代码,因为实际的异常抛出了好几层,所以遵循.UserHelper.importUsers(data,admin)会很复杂;是不是抛出了一个异常比!导入器(数据、管理);是不是抛出了一个异常比!谢谢,这让我找到了解决方案。谢谢,这让我找到了解决方案。通常情况下,您应该只捕获与您所处级别相关的异常,因此对长捕获链感到厌倦。也就是说,有时候这个场景是强加给我们的……通常你应该只捕捉例外情况