2012-06-20 4 views
6

例外をスローするメソッドを宣言することは意味がありますか? とこの例外のサブクラスは です。 IOExceptionおよびFileNotFoundExceptionこの例外の例外とサブクラスをスローするメソッドの宣言

私は、両方の例外を呼び出し側メソッドで別々に処理するために使用されていると思います。 しかし、メソッドがのうち、のみを最も一般的にスローする場合、両方の例外を処理することは可能ですか?IOException

答えて

7
それを適切に処理します

しかし、メソッドが最も一般的なIOExceptionだけをスローする場合、両方の例外を処理することは可能ですか?

絶対に。 - それは冗長だ

try { 
    methodThrowingIOException(); 
} catch (FileNotFoundException e) { 
    doSomething(); 
} catch (IOException e) { 
    doSomethingElse(); 
} 

だから、それは方法の両方を宣言した場合、発信者は何ができるかに違いはありません:あなたはまだキャッチ別途それらをすることができます。ただし、は、考慮する可能性のある例外であるを強調することができます。これはJavadocでスロー宣言よりも優れています。

0

しかし、メソッドが最も一般的な> IOExceptionだけをスローする場合、両方の例外を処理することは可能ですか?

catch(IOException ex){ 
if(ex instanceof FileNotFoundException){} 
} 

しかし、これはきれいに見えませんが、両方の例外をスローすることはよさそうだ、でも呼び出し側は、この方法は、これらのこれらの例外をスローすることにことを知って来るので、彼らは

+0

あなたはそれはきれいではありません正しいです - しかし、それはどちらか、必要はありません。

彼らはまだ例外を区別し、この1のようにキャッチ構築物を用いて、異なるそれらを処理することができるようになります。私の答えとKarthik'sを参照してください。基本的にこの醜さを持つ必要はありません。 –

+0

@Jon私たちがIOExceptionをスローするメソッドを宣言すれば、呼び出し元はFileNotFoundExceptionを発生させることができることを知ることになるでしょうか? –

+0

FileNotFoundException *はIOExceptionです。したがって、メソッドがIOExceptionをスローすると宣言している場合は、常にキャッチしようとすることができます。どのような状況で起こるのかを特定するためには、文書化する必要があります。 –

0

はい、メソッドがIOExceptionをスローするだけの場合は両方を処理できます。

このような質問に答える最もよい方法は、それを実証して試してみることです。 JVMがあなたに答えを伝えさせます。ここで尋ねるよりも速くなるでしょう。

+0

実際には、テストクラスを書くのに必要な応答よりもかなり速くて速い応答でした。私の質問にも別の部分があったので、他の人にも役立つことを願っています。 –

0

はい。特定の特殊な例外を正しく処理することができます。あなたは次のように例外を処理する場合は、次のとおりです。

try { 
} catch (FileNotFoundException f) { 
//Try a different file 
} catch (IOException ioe) { 
//Fatal, Maybe bad blocks ... Bail out... 
} catch (Exception e) { 
//Something went wrong, see what it is... 
} 
3

は、それが意味のある例外と、この例外のサブクラスをスローするメソッドを宣言することです、例えばIOExceptionおよびFileNotFoundException?

通常、私が知っているほとんどのIDEでは、このような宣言について警告を出していません。 Javadocで投げられたさまざまな例外を文書化することができます。

ただし、メソッドが最も一般的なIOException(つまり、IOException)をスローする場合、両方の例外を処理することは可能ですか?

はい、キャッチブロックの順序が正しいことを確認する必要があります。catchブロックは、それ以外の場合は第二に分類されますので、ここで

try { 
    ... 
} catch (FileNotFoundException e) { 
    ... 
} catch (IOException e) { 
    ... 
} 

スローされた例外は、それが最初catchブロックでキャッチされますFileNotFoundException、であるならば、それが定義されている順に評価し、として扱われます一般IOExceptioncatch (IOException e)IOExceptionFileNotFoundExceptionを含む)をすべてキャッチするので、逆の順序は機能しません。 (実際には、後者はコンパイルエラーIIRCにつながる。)IOException

0

方法によってスローされる可能性がある、宣言(もっとジェネリック)、および(特定以上)FileNotFoundExceptionは、通常は良いことだ - それはです後でコードを使用する人々のための追加情報スローされる例外のそれぞれの状況がJavaDocに明示的に記述される必要があることに注意してください。

try { 
    yourAwesomeMethod() 
} catch (FileNotFoundException ex) { 
    // handle file-not-found error 
} catch (IOException ex) { 
    // handle other IO errors 
} 
関連する問題