为什么代码执行从未进入catch块(java)?
我试图从类UserHelper中的方法importUsers抛出(自定义)ImportException。我可以在调试器中看到执行了throw子句,但是调用importUsers方法的方法从未捕获异常 以下是引发异常的方法:为什么代码执行从未进入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
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可能与实际执行的源代码不同步,特别是如果您的代码是外部库的一部分。。。如果更改库的代码而不更新实际的
类路径
,或者如果在调试过程中发生了更改,则代码行可能会更改,并且您可能会看到抛出的异常,尽管这并没有真正发生。尝试捕获抛出的异常和错误的根源,包括:
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)会很复杂;是不是抛出了一个异常比!导入器(数据、管理);是不是抛出了一个异常比!谢谢,这让我找到了解决方案。谢谢,这让我找到了解决方案。通常情况下,您应该只捕获与您所处级别相关的异常,因此对长捕获链感到厌倦。也就是说,有时候这个场景是强加给我们的……通常你应该只捕捉例外情况