4

我(Java 新手)正在 Eclipse 中运行 Java 程序(我从 SourceForge 下载的项目)。当我调试它时,它总是在这个位置结束,这发生在一个 50 行的 try 块之后:

catch (Exception ex){
    System.err.println("PROCESSING ERROR: " + ex.getMessage());
    helpFormatter.printHelp(usage, options);
}

如何找到并调试触发此异常的代码行?(即查看行号、检查局部变量、评估表达式等)如果我在 catch 之后放置一个断点,我看不到任何方法可以返回到原始错误或至少找出行号。我可以单步执行 try 块中的代码,但是有很多循环,因此可能会非常耗时。

我该如何调试呢?

4

6 回答 6

4

看看堆栈跟踪。你可以在某个地方找到一个 Eclipse 选项卡,或者当你发现异常时直接打印它:

catch (Exception ex){
    ex.printStackTrace();
}

检查堆栈跟踪是快速找到错误的最快速、最安全的方法。即使您设置了一个断点(或者最坏的情况是使用一些打印来定位最后执行的语句),您也无法准确确定异常发生的位置。事实上,异常可能在调用堆栈的更深处引发,不一定是在断点后调用的第一个方法中。

于 2012-08-05T23:06:03.257 回答
3

添加“异常断点”。它将在问题首次出现的异常的根本原因处停止。

首先确定抛出什么类型的特定异常 - 通过在 catch 块中设置断点来执行此操作,并查看 ex 是什么类型的异常(通过在变量窗口中查看它)。删除断点,然后按 F8 继续。

现在添加一个异常断点。这是通过转到断点视图并单击看起来像“J!”的图标来完成的。指定您看到的特定类型。现在运行代码,它应该在抛出异常的地方停止。

另一方面:简单地捕获异常通常不是一个好主意,您最好尝试捕获特定类型,尽管就像您说的那样,这不是您的代码。

于 2012-08-07T01:15:22.297 回答
1

在 try 块的开头设置断点,在调试视图中,您将能够看到您感兴趣的所有细节:行号、检查局部变量、评估表达式等

于 2012-08-05T23:07:25.180 回答
1

在 try 块的第一行放置一个断点,然后跳到下一行,直到它跳转到 catch 块。然后你知道你在那条线上遇到了例外。然后您可以检查异常以查看问题所在。由于您无法“返回”,您可能会再次调试以查看导致问题的原因。

但在大多数情况下,查看堆栈跟踪中指示的行就足够了。如果要检查状态,可以将断点放在此行中。

于 2012-08-05T23:08:50.470 回答
0

您可以暂时删除 try/catch 块,以便调试器在出现异常时停止。(您可能不得不作弊并添加throws Exception到您的方法签名中。)

于 2012-08-05T23:46:55.733 回答
-1

对我来说最好的调试解决方案是在每个主要代码块之后放置多个 Print 语句。

System.out.println("1");

//Code1 block

System.out.println("2");

//code 2 block

System.out.println("3");

//code 3 block

System.out.println("4");

通过这样做,您可以查看执行并修改它的最后一个打印语句。打印的最后一个数字,然后是 catch 语句的堆栈跟踪应该会有所帮助。

于 2012-08-05T23:08:48.950 回答