在IntelliJ中,当我触发异常时,如何回顾并找到引发它的行?

时间:2016-09-09 19:29:36

标签: java exception intellij-idea

当我通过单步调试Java代码块时,某些行引发异常,我需要搜索引发它的行。

但是现在我已经处于异常处理程序代码的中间。有没有办法跟踪我的程序中哪一行代码引发了这个异常?

我正在使用IntelliJ Idea 16.2。

3 个答案:

答案 0 :(得分:1)

有几种方法。首先,如果您根本不捕获异常,JVM会将其禁止进入标准错误流(stderr),您的线程将终止。如果发生这种情况,IntelliJ将在输出控制台中打印它(如果你正在使用Darkula主题,我相信stderr以红色文字出现)并带有完整的堆栈跟踪。 IntelliJ还格式化输出,以便您可以单击每个堆栈元素的行号并查看异常的确切位置。

或者,如果您已捕获异常并希望更优雅地处理它但仍希望输出行号,则可以告诉Exception将其自身打印到特定的PrintStream(例如System.out或{{ 1}})使用java.lang.Throwable#printStackTrace(java.io.PrintStream)方法。

现在,如果您实际上正在调试应用程序(使用断点和诸如此类步骤),事情就更容易,更详细。 IntelliJ的调试器非常适合查看整个堆栈(如果您正在调试远程应用程序,虽然速度有点慢)。它看起来像这样:http://i.imgur.com/Yv4IgKj.png

在顶部,您有源代码。在下面你有你的调试器。 "框架"窗格是你的调用堆栈;您可以单击堆栈中的任何方法来查看它及其所有堆栈变量。只需点击几下,您就可以看到抛出异常的位置,只需浏览堆栈框架并查找相关的System.err语句。

但等等,还有更多!你知道你正在寻找什么样的例外,并且想要在它被抛出后立即中断吗? IntelliJ可以做到这一点!点击"查看断点"按钮(关闭到“框架”窗格的左侧),您可以通过指定要捕获的Exception类的名称来add an Exception Breakpoint。只要抛出该时间的异常,您的调试器就会暂停并带您进入。这使得导航到特定的Exception变得微不足道。

答案 1 :(得分:1)

如果在调试器会话中有范围异常,请按Mac中的Alt+F8(评估表达式),不确定其他操作系统,然后执行exception.printStacktrace()(或只看{{1}类检查器中的数组)。

答案 2 :(得分:1)

在调用此过程的方法中放置一个断点,使用F7按行执行顺序移动,F8转到下一个断点,F9结束方法过程。您可以使用try catch块来处理此异常,并在控制台中登录什么类型以及抛出它的行。

希望它有所帮助。