2017-07-06 40 views
0

メソッドが例外をスローすると、コールスタックを検索してハンドラの権利を検索しますか?その意味で、exep.second();でエラーが発生するのはなぜですか??たとえ私がメソッドの例外をキャッチしたとしても、second()。ここに私のコードです:例外処理エラー

public class Exep { 
void first()throws IOException{ 
    throw new IOException("device error"); 
} 
void second()throws IOException{ 
    try{ 
     first(); 
    }catch(Exception e){ 
     System.out.println(e); 
    } 
} 
public static void main(String args[]){ 
    Exep exep = new Exep(); 
    exep.second(); 
} 

}

しかし、エラーがを追加することで消えメイン()にIOExceptionがをスローします。どうして?

+0

予想される出力と実際の出力を表示できますか? – byxor

+3

'IOException'はチェック例外です。コンパイラは、 'exep.second()'への呼び出しがそれをスローしないことを知らないので、コードはコンパイルされません。 – jsheeran

+0

@byrox私はException handlingを学習していましたが、例外がキャッチされたときに "device error"を出力したかっただけです。 – Vyshak

答えて

2

IOExceptionはチェックされた例外であり、なんらかの方法で処理する必要があります。メインにthrows IOExceptionを追加するとこの動作は抑制されますが、それは良い方法ではありません。 second()

、あなたはfirst()からすべての例外をキャッチし、あなたはまだsecond()の宣言でthrows IOExceptionが含まれます。 first()によってスローされた例外がすべてsecond()で捕捉され、処理されることを保証できるので、これは必須ではありません。

詳細については、Exceptions

1

void second() throws IOExceptionを宣言してからメインのメソッドを呼び出す場合は、first()メソッドと同じように、このメソッドがスローする例外をキャッチする必要があります。その場合、second()にはthrows句が必要ありません。

1

メソッドsecond()が例外をスローすると明示的に宣言しました。コンパイラは、例外がメソッド内で実際にキャッチされていることに気付かない。 catchの部分をmain()に移動するとエラーが表示されなくなります。または、あなたが何も投げていないので、throwsステートメントを削除してください。

0

second()がIOExceptionをスローすることをコンパイラに伝えていますが、second()を呼び出すとtry/catchブロックでラップされません。そのままにしたい場合は、メインの内側にtry catchブロックを含める必要があります。

しかし、あなたが持っているように、second()の内部から例外をスローすることはありませんので、そこからthrows IOExceptionという行を削除することができます。