如何查看给定方法中抛出的运行时异常?

时间:2015-05-27 15:04:41

标签: java eclipse exception exception-handling try-catch

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

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

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

那么,有没有办法让Eclipse向我展示类似"小心,你的方法会抛出IllegalArgumentException和JSONException,但是你缺少一些你可以在内部捕获的运行时异常或声明你也扔了#34; ?到目前为止,Eclipse只向我展示了我必须在方法的签名中声明的异常,但我也想被迫声明(未经检查的)运行时异常。

Ps。:这不是How can I know what exceptions can be thrown from a method?的副本,因为最好的解决方案是使用catch-all块。

2 个答案:

答案 0 :(得分:2)

简短的回答是:你做不到。

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

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

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

现在有两种类型的问题:

A)您“期望”的那些以及您提供细粒度反馈的地方。例如,您的API规范可能会列出许多400.xxx,409.xxx,......各种问题的答案。对这些事情使用“已检查”异常是有意义的(抛出“ApiException”的代码已经知道此错误应该向restful API的用户显示为409.xxx)。

B)然后有那些你“不指望”的;基本上那些反映了代码中的“错误”;比如“他,这个论点不应该是空的”; “他,这个'关键'是未知的”。对于那些......只需抛出RuntimeExceptions。 确保您的顶层抓住它们;例如,将它们转换为对用户的500.xxx答案(“发生了一些内部错误,这里是堆栈跟踪;向我们发送错误报告)

答案 1 :(得分:2)

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

让我们反过来问:你想从catch子句中排除哪个例外?如果要捕获所有已检查的异常以及所有运行时异常,则排除Error和那些可能的运行时异常。嗯,这就是catch(Exception ex){ … }已经做的事情。它不会捕获Error,您无需担心无法发生的异常。

那就是说,你不应该抓住RuntimeException s。即使在编译时无法证明它们的不可能性,它们也可以发出通常不应发生的信号。

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

  • 对对象或数组的每次访问都可能导致NullPointerException
  • 每次访问阵列都可能会导致ArrayIndexOutOfBoundsExceptionNegativeArraySizeException
  • 每个阵列写访问都可能导致ArrayStoreException
  • 每个整数除法可能会导致ArithmeticException
  • 每个运行时类型强制转换(包括泛型隐藏的那些)都可能产生ClassCastException

等。这些只是与语言结构相关的例外,不包含那些可能由库方法产生的例外。

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

你需要在catch子句中使用一个非常大的异常类型列表,并且只是为了隐藏你实际上试图捕获所有异常的事实(因为catch(Exception ex)会立即显现)...