【问题标题】:How can you figure out where an exception was thrown?你怎么知道哪里抛出了异常?
【发布时间】:2013-03-17 18:46:28
【问题描述】:

假设你有这样的代码:

Random rnd=new Random();
try {

  if(rnd.nextInt(1000)==0) {
     throw new Exception();
  }
  // repeat above code N times, N being big.

}catch(Exception e) {
  LOGGER.error("caught:", e);
} 

现在我在 catch 子句中添加一个断点。如果它被 caugt,我怎样才能找出引发异常的行号?

【问题讨论】:

  • @R.J:这与声誉无关。这是关于发送消息。
  • 堆栈跟踪应该指出哪里出错了
  • 永远不要抛出java.lang.Exception。请。如果需要,请编写您自己的特定内容,但不要抛出Exception。在那之后你的同事可能会抛弃你。
  • @EricJablow 仍然比 Throwable
  • @Woot4Moo:class Ball extends Throwable{} 和上周的 xkcd 一样吗?

标签: java eclipse debugging exception


【解决方案1】:

你已经知道行号了,它是带有throw new Exception() 的行;)

如果你的意思是你想知道你已经循环了多少次,那么你可以在你的构造函数中包含循环计数器,然后用e.getMessage()再次取出它

【讨论】:

  • 感谢您的反对。通过阅读问题,我了解到只有一行可能会引发异常(因此堆栈跟踪对于找出问题所在没有用),但是这一行被执行了多次 - 因此比“新”更有意义Exception()" 应该被抛出。
【解决方案2】:

添加异常断点:

在异常对话框中,按“J!”按钮,然后捕获异常。

以下是截图:

http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Freference%2Fviews%2Fbreakpoints%2Fref-addexception_viewaction.htm

【讨论】:

  • 为什么这被否决了?这是所有情况下唯一可行的解​​决方案,包括没有源代码的第三方二进制代码。
  • @Bananeweizen,他正在回答他自己的问题。
  • @NikolayKuznetsov 在 stackoverflow 上允许自我回答问题,并且没有理由拒绝投票。投票将判断答案的内容,而不是发布者。见meta.stackexchange.com/questions/17463/…
【解决方案3】:

堆栈跟踪包含此信息。

ideone

堆栈跟踪:

Exception in thread "main" java.lang.Exception
    at Main.main(Main.java:8)

【讨论】:

  • 这并不总是正确的,因为行号可能会丢失,具体取决于编译器设置。
  • @Bananeweizen 并且为了讨论这些 java 编译器设置是什么?
  • 抱歉错过了:javac -g:none。通过谷歌搜索“java stacktrace unknown source”查找更多信息,因为在这种情况下,您得到的是“unknown source”而不是“Main.java:8”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多