2010-12-07 2 views
1

public class MyClass { 
    public static void method() { 
    try { 
    // there is no compile time error for unnecessary catching 'Exception' 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 

    public static void main(String[] args) { 
    try { 
     // why compile time error for unnecessary catching 'MyException' or // 'CloneNotSupportedException' etc.. // ultimately Exception, MyException & CloneNotSupportedException all // are checked exception  

    } catch (MyException e) { 
     e.printStackTrace(); 
    } 
    } 
} 
class MyException extends Exception { 
} 

second scenario 
--------------- 
public class MyClass { 
    public static void method() throws Exception { 
    } 

    public static void main(String[] args) { 
     // if Exception itself is not checked , // why compile time error occured for calling method(); ?? 
     method(); 
    } 
} 



答えて

3

RuntimeExceptionsはExceptionクラスのサブクラスです。したがって、コンパイラは、jvmによってスローされる可能性があるため、実行時例外をスローするコードがあるかどうかを判断することはできません。 一方、一部のメソッドによってスローされるチェック例外を宣言しなければならないため、コンパイラはスローされる可能性のある例外を認識し、不要なcatchブロックを判断できます。

+0

返信ありがとうございます。 例外自体がチェックされていない例外の場合は、処理する必要があるのはなぜですか? 2番目のシナリオを参照してください。 – SmartSolution

+0

例外がチェックされた例外である可能性があるためです。 –

+0

結論は 'Exception'クラスの振る舞いはChecked&Unchecked例外を混在させるようなものです。 1)チェックされた振る舞い:スロー句で使用される場合、呼び出し先関数はキャッチまたは転送する必要があります 2) :JVMで 'Exception'が許可された不要なtry-catchブロック。右 ??コードの下時エラーをコンパイルスロー理由例外自体は、次にチェックされていない場合のjavac(ないJVM) – SmartSolution

1

メソッドは、スローされた例外を宣言します。既知の例外タイプのスーパークラスではないものをキャッチしている場合は、キャッチは必要ありません。

0

我々は例外と未チェック例外をチェックしています。 CloneNotSupportedExceptionはチェック例外です。メソッドをスローした場合、呼び出し元はをキャッチしてこのタイプの例外をキャッチする必要があります。そのような場合、jvmはキャッチされているかどうかを検出できますが、tryブロック内のメソッドはそれをスローしません。

Exception自体はチェックされていません。

+0

で許可さ – SmartSolution

関連する問題