Javaメソッドのイントロスペクション、特に例外に関する質問があります。私は、次のコードを持って言う: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
の内容をキャッチブロックの中に入れたら、それはコンパイルされます。
例外をスローする例外は実行時例外ですが、私は例外をチェックするようにも試みましたが、問題は残っています。
誰かが理由を説明できますか?
感謝。したがって、メソッドの内容(translateIntoRelevantException)をcatchブロックに移動すると(コンテンツは暗黙的に無効になり、100%のケースで例外がスローされます)、動作します。私は、コンパイラがメソッドを見て、すべてのケースで例外がスローされていることを知ることができると考えました。コンパイラがモジュール化を不利にしているようですが、それは変です。 –
もう一つのクールなトリックです:http:// stackoverflow。com/a/39719455/14955 – Thilo
いいえ、コンパイラーは* into *メソッドを、宣言されたシグネチャだけで探すわけではありません。そして、メソッドが決して返ってこないことを宣言する方法はありません(例えば、スカラでは、戻り値の型が単にそれを行うために 'Nothing'と言うことができます)。メソッドの実装を見ると、同じクラスのプライベートメソッドに対しては機能するかもしれませんが、動的メソッドディスパッチ(サブクラス化)が関わるとすぐに、それはもう動作しません。 2つを区別することは問題の価値がないようです。 – Thilo