1

Java で例外と同じようにエラーを処理できるかどうかを知りたいです。AssertionError などの処理できないエラーを見たことがあります。また、プログラム内でエラーをスローして、catch を使用して処理しようとしましたが、機能し、コードの次の部分も実行されました (これは、エラーが発生するたびに終了するはずのプログラム)。処理できるエラーはほとんどなく、処理できないエラーはほとんどありません。私はこれと混同しています。誰かが私のこの疑問を解消し、エラーと例外の違いを述べることができますか?

package package1;

public class Class1 
{   
public static void main(String[] args)
{
    Class1 cl1=new Class1();
    int x=2;
    String s = null;
    //assert(x<0):"x is not less than zero";
    try
    {
        cl1.workonExceptions();
    }
    catch (Error e)     
    {
        e.printStackTrace();
    }
    System.out.println("Not Terminated yet");
}
public void workonExceptions() throws Error 
{                                               
    try                                         
    {
        throw new Exception("Exception");
    }
    catch (Exception e) 
    {
        throw new Error("Exception Again");         }
}
}
4

3 に答える 3

4

いくつかの背景Error: キャッチ可能にすることを意図したものではありません。何かが 本当に うまくいかない場合にのみ発生します。例外は、時々発生する可能性があるため、キャッチして処理することを目的としていますが、ゼロ除算など、プログラムの実行を中断したり、ひどく干渉したりしてはなりません。

ステートメント内での動作については、これがクラスtry...catchのプロパティであるためです。Throwable

このクラス (またはそのサブクラスの 1 つ) のインスタンスであるオブジェクトのみが、Java 仮想マシンによってスローされるか、Java の throw ステートメントによってスローされる可能性があります。同様に、このクラスまたはそのサブクラスの 1 つだけが catch 句の引数の型になることができます。

于 2012-06-08T22:57:36.070 に答える
1

を含む Java のすべてのエラーはキャッチ可能ですが、AssertionErrorそれらをキャッチすることはお勧めできません。また、JVM がError. したがって、あなたが見るものは完全に正常です。

C# とは異なり、evenThreadDeathは他のものとほとんど同じように処理されますThrowable(つまり、キャッチして使用することができます)。

エラーと例外の主な違いは、例外指定子に関係なく、メソッドがエラーをスローできることです。

于 2012-06-08T23:05:27.530 に答える
1

例外がメソッドからスローされた場合、コンパイラはそのメソッドの呼び出し元によってキャッチされる必要があります。

エラーは、メソッドからスローされた場合でも、コンパイラがメソッドの呼び出し元によってキャッチされる必要はありません。

例外とエラーの両方が呼び出し元によってキャッチされる可能性があり、キャッチされた場合と同じように動作します。「実行し続ける」ことを示すコードがある場合は、それを見てみたいと思います。これらのいずれか (両方とも Throwable から派生) をスローすると、それらがスローされたメソッドの実行はその時点で停止します (finally 句がないため、この投稿では取り上げたくないルールの (エヘム) 例外です) )。

于 2012-06-08T23:02:41.593 に答える