当我通过单步执行调试一段Java代码时,有一行抛出了异常,我需要搜索抛出异常的是哪行。
但是现在我已经在编写异常处理程序代码了。有没有办法追踪我的过程中哪一行代码抛出了这个异常?
我使用的是IntelliJ Idea 16.2。
发布于 2016-09-10 03:43:14
如果在调试器会话中的范围内有异常,请在Mac中按Alt+F8 (计算表达式),不确定其他操作系统,然后执行exception.printStacktrace(),您将在控制台窗口中获得可单击的堆栈跟踪(或者在类检查器中查看stackTrace数组)。
发布于 2016-09-10 03:43:00
有几种方法。首先,如果您根本没有捕获到异常,JVM将把它放入标准错误流(stderr)中,您的线程将终止。如果发生这种情况,IntelliJ将在输出控制台中打印它(如果您使用的是Darkula主题,我相信stderr会以红色文本显示),并显示完整的堆栈跟踪。IntelliJ还对输出进行格式化,以便您可以单击每个堆栈元素的行号并查看异常的确切来源。
或者,如果您已经捕获了异常并希望更优雅地处理它,但仍然希望输出行号,则可以使用java.lang.Throwable#printStackTrace(java.io.PrintStream)方法告诉该异常将其自身打印到特定的PrintStream (如System.out或System.err)。
现在,如果您真的在调试应用程序(使用断点和诸如此类的东西来逐步调试它),事情就会变得更容易、更详细。IntelliJ的调试器非常适合查看整个堆栈(尽管在调试远程应用程序时会有点慢)。它看起来像这样:http://i.imgur.com/Yv4IgKj.png
在上面,你有你的源代码。下面是你的调试器。"Frames“窗格是您的调用堆栈;您可以单击堆栈中的任何方法来查看它及其所有堆栈变量。只需单击几下,您就可以看到异常是从哪里抛出的,只需导航堆栈帧并查找相关的throw语句。
但是等等,还有更多!你知道你正在寻找什么异常,并且想要在抛出它时立即中断吗?IntelliJ可以做到!单击“查看断点”按钮(在框架窗格的左侧),您只需指定要捕获的异常类的名称即可执行add an Exception Breakpoint。一旦抛出该时间的异常,您的调试器将暂停并将您带到它。这使得导航到特定的异常变得微不足道。
发布于 2016-09-10 03:59:53
在调用此过程的方法中放置一个断点,使用F7按执行顺序在行之间移动,使用F8转到下一个断点,使用F9结束方法进程。您可以使用try catch块处理此异常,并在控制台中记录类型以及抛出它的行。
希望能有所帮助。
https://stackoverflow.com/questions/39418534
复制相似问题