[解決済み] Java unreachable catch block コンパイラーエラー
質問
なぜJavaでは
Exception
をスローしていないのに、そのサブクラスをキャッチすることができません("unchecked".を除きます)。
RuntimeException
とそのサブクラス)。コード例
class Test {
public static void main(String[] args) {
try {
// do nothing
} catch (Exception e) {
// OK
}
try {
// do nothing
} catch (IOException e) {
// COMPILER ERROR: Unreachable catch block for IOException.
//This exception is never thrown from the try statement body
}
}
}
何かアイデアはありますか?
解決方法は?
A
RuntimeException
が投げられる可能性があります。
任意の
のコードです。言い換えれば、コンパイラはどのようなコードがこれを投げるかを容易に予測することはできません。A
RuntimeException
が引っかかることがあります。
catch(Exception e)
ブロックを作成します。
IOException
しかし、これはチェックされた例外であり、これを投げると宣言されたメソッドコールだけがこれを投げることができます。コンパイラは、これを投げるように宣言されたメソッドコールがない限り、この例外が発生することはあり得ないと(合理的に)確信することができるのです。
Javaコンパイラは、tryブロック内にまったくコードがない、という状況を考慮しません。 合理的 シナリオでは 可能性がある チェックされていない例外を投げる可能性があります。
から セクション14.21 の「JLS」を参照してください。
キャッチブロックCは、以下の両方が真であれば到達可能である。
- tryブロック内のある式またはthrow文は到達可能であり、その型がcatch句Cのパラメータに割り当て可能な例外を投げることができます(式は、それを含む最も内側の文が到達可能である場合に到達可能とみなされます)。
- try文の中に、Cのパラメータの型がAのパラメータの型と同じかサブクラスであるような先行するキャッチブロックAが存在しない。
を認識する必要があります。 いいえ この場合、try ブロックの中にある式は、まだ到達不可能な catch 節に見えます。
EDIT: コメントにある通りです。 セクション14.20 には、これが含まれています。
を指定した場合、コンパイルエラーとなります。
catch
節はチェックされた例外タイプ E1 しかし、チェックされた例外タイプは存在しない E2 がすべて成立するような
- E2 <。 E1
- は
try
ブロックに対応するcatch
を投げることができます。 E2- 先行なし
catch
のブロックは、try 文の直後にある E2 のスーパータイプ、または E2 .ない限り E1 はクラスExceptionです。
ということのようですね。 実際に しかし、14.21の到達不能なキャッチブロックに関しては、仕様が明確ではありません。
関連
-
[解決済み] if / for / while 内で "Missing return statement" が発生する。
-
[解決済み】Java JDK - doubleからintへの非可逆変換の可能性
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み】Javaではfinallyブロックは必ず実行されるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] if / for / while 内で "Missing return statement" が発生する。
-
[解決済み】imageio.IIOException: 入力ファイルが読み込めない
-
[解決済み】代入の左手は必ず変数 CharAt
-
[解決済み】Javaの".class期待値"
-
[解決済み】StringUtils.isBlank() vs String.isEmpty()
-
[解決済み】Doubleはdereferencedできない?
-
[解決済み】Mockitoでモックからチェックされた例外を投げる
-
[解決済み] メソッドがそのスーパークラスのメソッドをオーバーライドしない
-
[解決済み】なぜjava.io.Fileにはcloseメソッドがないのでしょうか?
-
[解決済み] intellijが自動配線リポジトリにタイプのBeanが見つからないと不正確な発言をする件