2017-02-09 21 views
1

私はtry catchを使ってjavaでErrorを処理すべきではないことを知っていますが、学習のために試してみました。 catchブロックの後のコードも実行されています。 StackOverFlowErrorを生成しましたが、引き続きローカル変数を初期化できます。 誰でも説明できますか?このクラスのなぜエラー処理が推奨されないのですか?

import java.util.LinkedList; 
import java.util.List; 

public class ExceptionDemo { 

    public static void main(String[] args) { 
     try{ 
       method1(); 
     } 
     catch(Error e){ 
      System.out.println(e.getStackTrace()); 

      System.out.println("Hello world"); 
      int a =10; 
      System.out.println(a);   
      method(); 
     }  
     System.out.println("Hello world2"); 
    } 

    public static void method1(){ 
     method1(); 
    } 

    public static void method(){ 
     List l1 = new LinkedList(); 
     l1.add("A");   
     int[] aa = new int[10000]; 
     aa[0]=25; 
     System.out.println(aa[0]); 

     int b =10; 
     int c = 20;  
     System.out.println(b +""+c); 
    } 
} 

出力がある - 私は「なぜエラーをキャッチしない」に関連ではありませんあなたの質問の一部に私の答えに焦点を当て

[Ljava.lang.StackTraceElement;@1db9742 

Hello world 
10 
25 
1020 
Hello world2 
+2

あなたは何を求めていますか? –

+0

ようこそスタックオーバーフロー! [ツアー]を見て回り、[ヘルプ]、特に[*どのように良い質問をしますか*](/ help/how-to-ask) –

+0

でも読むことができますオブジェクトとローカル変数、どのように起こっている? –

答えて

5

。あなたが「エラーを捕まえることはできない」という暗黙のアイデアです。あなたの考えは間違っているからです!

のすべてのサブクラススローブです。ちょうど言葉を見て:を投げることができるすべてをキャッチすることもできます。

ErrorはThrowable!のサブクラスです。

しかし、ExceptionというThrowableという他の子クラスのインスタンスだけがtry/catchを使用して捕捉されるべきであるという事実は正しいです。 「なぜエラーをキャッチしないのか」それは広範に説明されているhere

+1

エラーが発生した場合、JVMがその時点から正しく動作することを保証できません。確かに、それはあなたがそれをキャッチしていくつかのことをやろうとするでしょう(結局のところ、エラーを記録するのが理にかなっています)が、その時点でプログラムが不安定であると考えるべきです。 –

+1

それは最後の段落が最後に指しているものです。また、実際にはそれは本当に依存しています。私たちは分散環境を持っています。また、別のシステムに誤ったバージョンのJavaクラスを置くと、そのシステムでMethodNotFoundErrorsが発生することがあります。そして私たちは実際にそれらを捕まえます(LinkageErrors methinks)それをキャッチすることで、操作が失敗したときに必要なクリーンアップを実行できます。 – GhostCat

関連する問題