我有一个关于Java方法内省的问题,特别是有关异常的问题。说我有以下代码:
private String getCustomReportResponse(HttpsURLConnection customReportConnection) {
int responseCode = 0;
try {
responseCode = customReportConnection.getResponseCode();
return httpResponseBodyExtractor.extractResponseBodyFrom(customReportConnection);
} catch (IOException e) {
translateIntoRelevantException(responseCode, e);
}
}
假设try块中的两个语句都能抛出IOException - 在这种情况下,调用translateIntoRelevantException
方法,如下所示:
private void translateIntoRelevantException(int responseCode, IOException e) {
if(is5xxResponseCode(responseCode)) {
throw new ServerResponseException("Could not generate report - returned response code " + responseCode, e);
}
throw new ReportException("GeminiReportException: Unable to parse response from HTTP body when requesting custom Gemini report.", e);
}
因此,无论发生什么,都会返回String,或抛出异常。除了getCustomReportResponse
方法没有在catch块之后添加return语句而编译时,这是绝对无法访问的。事实上,如果我把translateIntoRelevantException
的内容放在catch块中,它会编译,这对我来说似乎很蠢。
我应该补充一下,抛出的异常是运行时异常,但我也试过让它们检查异常,但问题仍然存在。
有人可以解释一下原因吗?
答案 0 :(得分:1)
这是common problem"重新抛出"辅助方法面临。
编译器不知道(并且无法指示)方法translateIntoRelevantException
永远不会返回。
因此,它认为在try
阻止之后会有一个代码路径继续。所以你必须加入一个死密码" return null
(或throw new RuntimeException("should never come here")
。
您不必在try
区块之后放置它,您可以将其放在catch
内。
try {
responseCode = customReportConnection.getResponseCode();
return httpResponseBodyExtractor.extractResponseBodyFrom(customReportConnection);
} catch (IOException e) {
translateIntoRelevantException(responseCode, e);
throw new RuntimeException("should never come here");
}
让助手只是return
而不是抛出它可能更漂亮。然后就可以了
throw translateIntoRelevantException(responseCode, e);
答案 1 :(得分:1)
getCustomReportResponse
的汇编不应依赖于translateIntoRelevantException
的实施,原因有多种:
translateIntoRelevantException
的实施可能不可用(它可能位于单独的类中,位于单独的库中); translateIntoRelevantException
中的任何更改都可能会破坏所有调用方法。作为替代方案,您可以返回异常,然后将其放入客户端代码中:
private IOException translateIntoRelevantException(int responseCode, IOException e) {
if(is5xxResponseCode(responseCode)) {
return new ServerResponseException("Could not generate report - returned response code " + responseCode, e);
}
return new ReportException("GeminiReportException: Unable to parse response from HTTP body when requesting custom Gemini report.", e);
}
然后这样称呼:
throw translateIntoRelevantException(responseCode, e);