I have a question about Java method introspection, specifically concerning exceptions. Say I have the following code:
private String getCustomReportResponse(HttpsURLConnection customReportConnection) {
    int responseCode = 0;
    try {
        responseCode = customReportConnection.getResponseCode();
        return httpResponseBodyExtractor.extractResponseBodyFrom(customReportConnection);
    } catch (IOException e) {
        translateIntoRelevantException(responseCode, e);
    }
}
Let's say both statements in the try block are capable of throwing an IOException - in which case, the translateIntoRelevantException method is invoked, which looks like this:
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);
}
So, whatever happens, either a String is returned, or an exception is thrown. Except the getCustomReportResponse method does not compile without adding a return statement after the catch block, which is absolutely unreachable. In fact, if I put the contents of translateIntoRelevantException inside the catch block, it compiles, which seems daft to me.
I should add, the exceptions being thrown are runtime exceptions, but I've also tried making them checked exceptions, but the problem persisted.
Could someone please explain why?
 
     
     
    