我有一个调用其他几种方法的方法。但是,这些方法和其他操作(如导航数组或使用空指针)可能会抛出非显式的运行时异常。
可以使用 try {...} catch(Exception e){...} 块来确保没有任何异常越过障碍,并且我的方法不会抛出任何在签名中未明确声明的异常。
然而,这个解决方案是丑陋的并且容易出错,因为我可能不想捕捉所有内容,或者我可能想要在特定错误情况下提供某些特定行为。
那么,有没有办法让Eclipse向我展示类似"小心,你的方法会抛出IllegalArgumentException和JSONException,但是你缺少一些你可以在内部捕获的运行时异常或声明你也扔了#34; ?到目前为止,Eclipse只向我展示了我必须在方法的签名中声明的异常,但我也想被迫声明(未经检查的)运行时异常。
Ps。:这不是How can I know what exceptions can be thrown from a method?的副本,因为最好的解决方案是使用catch-all块。
答案 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
ArrayIndexOutOfBoundsException
或NegativeArraySizeException
ArrayStoreException
ArithmeticException
ClassCastException
等。这些只是与语言结构相关的例外,不包含那些可能由库方法产生的例外。
如果您真的要求工具为特定代码片段和所有调用的方法收集它们,那么可能的异常集将很快爆炸。
你需要在catch子句中使用一个非常大的异常类型列表,并且只是为了隐藏你实际上试图捕获所有异常的事实(因为catch(Exception ex)
会立即显现)...