我有一个看起来像这样的方法:
try {
doStuff();
} catch (Exception ex) {
logger.error(ex);
}
(我并没有真正使用像 doStuff 这样的方法名称 - 这只是为了让事情变得简单)
在 doStuff 中,我做了很多事情,其中包括调用数据访问方法(因此,doStuff 中的另一个方法),其结尾如下:
} catch (SQLException ex) {
logger.error(ex);
} finally {
try {
connection.close();
proc.close();
results.close();
} catch (Exception e) {
logger.error(e);
} //<--Exception thrown here. HUH?
}
return stuff;
当单步执行此代码时,我到达倒数第二个大括号(用注释标记),然后跳转到第一个代码块中的 catch 并出现 NullPointer 异常。这results.close()
是在它之前运行的内容(结果不为空)。我的 IDE (NetBeans) 不提供堆栈跟踪(它显示堆栈跟踪为空)或除异常名称之外的任何其他信息(据我所知)。
这段代码之前运行良好。事实上,在它运行时,我更改了数据访问方法(我在其中收到此异常)正在调用的存储过程,然后此错误开始发生(应用程序根本没有停止)。此后我尝试重建并重新启动但无济于事。我可以将存储过程改回来,但我真的想找出这个错误是从哪里来的,因为考虑到代码中发生异常的位置,存储过程甚至成为此错误的一部分是没有意义的。
您的 doStuff() 方法抛出了 SQLException 以外的其他内容,并且没有被捕获。添加一个 catch(Exception e) 块并记录该异常并看看会发生什么。
此代码示例表现出与您描述的相同的行为:
public class TryCatchTest {
public static void main(String[] args) {
try {
System.out.println("foo");
throw new NullPointerException();
} finally {
try {
System.out.println("bar");
} catch (Exception e) {
e.printStackTrace();
}
} // exception thrown here
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)