Java 如何查看给定方法中引发的运行时异常?

Java 如何查看给定方法中引发的运行时异常?,java,eclipse,exception,exception-handling,try-catch,Java,Eclipse,Exception,Exception Handling,Try Catch,我有一个调用其他几个方法的方法。但是,这些方法和其他操作(如导航数组或使用空指针)可能引发非显式的运行时异常 可以使用try{…}catch(Exception e){…}块来确保没有任何野生异常跨越障碍,并且我的方法不会抛出任何在其签名中未显式声明的异常 然而,这个解决方案是丑陋的,并且容易出现错误,因为我可能不想捕获所有内容,或者我可能想提供一些特定错误情况下的特定行为 那么,Eclipse有没有办法向我展示类似于的东西呢“小心,你的方法说它抛出了IllegalArgumentExcepti

我有一个调用其他几个方法的方法。但是,这些方法和其他操作(如导航数组或使用空指针)可能引发非显式的运行时异常

可以使用try{…}catch(Exception e){…}块来确保没有任何野生异常跨越障碍,并且我的方法不会抛出任何在其签名中未显式声明的异常

然而,这个解决方案是丑陋的,并且容易出现错误,因为我可能不想捕获所有内容,或者我可能想提供一些特定错误情况下的特定行为

那么,Eclipse有没有办法向我展示类似于的东西呢“小心,你的方法说它抛出了IllegalArgumentException和JSONException,但是你缺少了一些运行时异常,你可以在内部捕获它们,或者声明你也抛出了它们”?到目前为止,Eclipse只向我展示了我确实必须在方法的签名中声明哪些异常,但我还想被迫声明(未经检查的)运行时异常


注:这不是重复的,因为最好的解决方案是使用一个全面的块。

简短的回答是:你不能

这就是RuntimeException的本质;它们不是“检查”异常;因此,不会强制您将它们添加到throws子句中

重要的是,在某种程度上,您的代码理解可能会发生运行时异常;并以正确的方式处理它们

示例:假设您正在处理“提供者”,该提供者应该处理来自restful API的请求

现在有两类问题:

A) 那些你“期望”的,以及你给予精细反馈的地方。例如,您的API规范可能会列出许多400.xxx、409.xxx。。。各种问题的答案。对这些事情使用“checked”异常是有意义的(抛出“ApiException”的代码已经知道,对于restfulapi的用户,这个错误应该显示为409.xxx)


B) 还有一些是你“不期望的”;基本上,这些都反映了代码中的“bug”;比如“他,这个论点不应该是空的”;“他,这把‘钥匙’不知道。”。对于那些。。。只抛出运行时异常但是确保你的顶层捕捉到它们;例如,将它们转换成一个500.xxx的答案给用户(“发生了一些内部错误,这里是stacktrace;给我们发送一个bug报告)

您的请求有一个有趣的转折点。您希望捕获调用的方法可能抛出的所有异常,但不希望使用
catch(Exception ex){…}
因为这意味着……您正在捕获所有异常

让我们换一种方式来问:您想从catch子句中排除哪个异常?如果您想捕获所有已检查的异常以及所有运行时异常,则排除
Error
s和那些可能不会发生的运行时异常。这就是
catch(exception ex){…}
已经有了。它不会捕捉到
错误
s,您也不需要担心不可能发生的异常

也就是说,您不应该捕获
RuntimeException
s是有原因的。它们是用来发出通常不应该发生的条件的信号,即使在编译时无法证明它们的不可能性

如果希望IDE收集原则上可能的所有运行时异常,请考虑

  • 对对象或数组的每次访问都可能导致
    NullPointerException
  • 每次阵列访问都可能导致
    ArrayIndexOutOfBoundsException
    NegativeArraySizeException
  • 每次阵列写入访问都可能导致
    ArrayStoreException
  • 每个整数除法都可能导致
    算术异常
  • 每个运行时类型转换,包括泛型隐藏的类型转换,都可能产生
    ClassCastException
这些只是与语言构造相关联的异常,不包含那些可能由库方法生成的异常

如果您真的要求工具收集特定代码段和所有调用方法的所有异常,那么可能的异常集很快就会爆炸


在catch子句中,您需要一个异常类型的大得惊人的列表,而这仅仅是为了隐藏您实际上正在尝试捕获所有异常的事实(因为
catch(exception ex)
会立即显示出来)…

您不希望捕获所有合理的
异常,但您可能希望捕获所有并非不合理的
运行时异常。这与您想要做的类似,就是控制这些未检查的问题蔓延。根据我的经验,我通常刚刚看到
(捕获异常)
不过,所以不确定它有多丑陋。
捕获(例外e)
通常会导致声纳违规(当然这取决于您的配置).Sonar是一个静态代码分析工具,它结合了其他几个工具的结果。如果我遇到关于内存不足的异常,我可能希望以给定的方式启动。因此,我必须知道,可以在该方法中抛出该异常,以便在该上下文中处理该异常。一个全面捕获块无法告诉我应该在该方法中引发哪些异常这种方法,我还想避免在代码中填充不必要的catch specific异常,因为不知道它可能被抛出到哪里。不确定这是否仍然是实际的,但我在某处学到了一个短语
Throw early,catch late
。这意味着您应该尽可能晚地捕获异常。例如,如果您正在处理一个me在一些深层次的计算中,当抛出异常时,您可以在入口处丢弃整个消息。(注意,在我的示例中,您可能必须还原在抛出异常之前所做的更改!)