63

これは私にとって非常に奇妙です。RuntimeExceptionから継承しException、から継承しThrowableます。

catch(Exception exc) { /* won't catch RuntimeException */

しかし

catch(Throwable exc) { /* will catch RuntimeException */

RuntimeExceptionはそれがチェックされていないという点で特別であることを知っています。しかし、私の理解では、例外がキャッチされるかどうかではなく、例外を宣言する必要があるかどうかにのみ適用されます。それでも、このロジックが をキャッチすると壊れる理由がわかりませんThrowable

RuntimeExceptionターミナル操作でスローされる可能性がある状況があるため、これは私にとって非常に重要です。このパターンの名前はわかりませんが、たとえば、私のクラスEmailRollerCallbacks. コードは次のようになります。

for(Callback cb : callbacks) {
    try {
        cb.call(item);
    }
    catch(Exception exc) {
        logger.error("Error in callback: ", exc);
   }
}

したがって、これは OOME のようなものがフライスルーする必要がある場合です。これらのコールバックの 1 つがすべてのマシン メモリを消費すると、他のコールバックの実行に確実に影響するからです。しかし、NullPointerException?またはIndexOutOfBoundsException?これらはコールバックに影響しますが、他の実行を妨げることはありません。

また、これは少しエンタープライズ向けの設計です。さまざまなプログラマーまたはチームがコールバックを追加してアイテムを処理できますが、それらは互いに分離する必要があります。つまり、これらのコールバックを相互に分離する責任を負うプログラマーとして、エラーがすり抜けないようにするためにコールバックに頼るべきではないということです。キャッチExceptionは正しいラインである必要がありますが、それはRuntimeExceptionすり抜けるからではありません。したがって、私のより一般的な質問は次のとおりです。ここで良いパターンは何ですか? ただcatch(Exception | RuntimeException exc)、継承による構文エラーだと思いますか?

4

5 に答える 5

153

Exception キャッチはキャッチするため、質問の前提には欠陥がありRuntimeExceptionます。デモコード:

public class Test {
    public static void main(String[] args) {
        try {
            throw new RuntimeException("Bang");
        } catch (Exception e) {
            System.out.println("I caught: " + e);
        }
    }
}

出力:

I caught: java.lang.RuntimeException: Bang

次の場合、ループに問題があります。

  • callbacks無効です
  • ループの実行中に何かが変更callbacksされます (配列ではなくコレクションの場合)

おそらくそれはあなたが見ているものですか?

于 2013-10-03T16:13:40.297 に答える
29
catch (Exception ex) { ... }

RuntimeExceptionをキャッチします。

catch ブロックに入れるものは何でも、そのサブクラスと同様にキャッチされます。

于 2013-10-03T16:12:46.290 に答える
12

キャッチExceptionするとRuntimeException

于 2013-10-03T16:16:37.007 に答える
3

私は同様のシナリオに直面しました。これは、classA の初期化が classB の初期化に依存していたために発生していました。classB の静的ブロックが実行時例外に直面したとき、classB は初期化されませんでした。このため、classB は例外をスローせず、classA の初期化も失敗しました。

class A{//this class will never be initialized because class B won't intialize
  static{
    try{
      classB.someStaticMethod();
    }catch(Exception e){
      sysout("This comment will never be printed");
    }
 }
}

class B{//this class will never be initialized
 static{
    int i = 1/0;//throw run time exception 
 }

 public static void someStaticMethod(){}
}

はい...キャッチExceptionすると、実行時の例外もキャッチされます。

于 2015-12-02T09:34:42.610 に答える
-3
class Test extends Thread
{
    public void run(){  
        try{  
            Thread.sleep(10000);  
        }catch(InterruptedException e){  
            System.out.println("test1");
            throw new RuntimeException("Thread interrupted..."+e);  
        }  

    }  

    public static void main(String args[]){  
        Test t1=new Test1();  
        t1.start();  
        try{  
            t1.interrupt();  
        }catch(Exception e){
            System.out.println("test2");
            System.out.println("Exception handled "+e);
        }  

    }  
}

その出力には test2 が含まれていないため、ランタイム例外を処理していません。@ジョン・スキート、@ジャン・ジカ

于 2018-04-05T08:02:45.490 に答える