4

クラス (回復不能なエラーの場合) とクラス (回復可能なエラーの場合)Throwableの基本クラスであるクラスがあります。ErrorException

そう、

1>クラスを実装するオブジェクトを作成でき ます (ただし、同じことを行うクラスがあるため、クラスを実装する意味はありません..)throwerrorErrorException

2> Javaはオブジェクトをキャッチすることを推奨していませんError..


Errorそれでは、オブジェクトの必要性は何ですか?コンパイラは内部的に実装できませんか? 間違いじゃないですか?

4

4 に答える 4

8

技術的には、実際には「回復不能エラー」と「回復可能エラー」を区別するのではなく、チェックされた例外とチェックされていない例外を区別します。Java次のようにそれらを区別します。

  • 句でチェック例外を宣言する必要があります。ブロックでthrowsチェック済み例外をスローするメソッドを使用する場合は、例外を指定するか、この例外をメソッドの句に追加する必要があります。trycatchthrows
  • 句で未チェックの例外を宣言できます (推奨されませ) 。ブロックでthrowsチェックされていない例外をスローするメソッドを使用している場合、その例外をスローするか、この例外をメソッドの句に追加することができます (いずれも推奨されません)。try catchthrows

自分が何をしているのか本当によくわかっていない限り、どのような種類のチェックされていない例外 (つまり、catch空のブロックで例外を飲み込む) もお勧めできません。

Exception基本チェック例外クラスです。ErrorRuntimeExceptionは両方とも未チェックの例外であり、それらのすべてのサブクラスもそうです。Throwable3 つのクラスはすべて extendsであり、javadoc には次のようにThrowable記載されていることに注意してください。

コンパイル時の例外チェックのために、Throwable と、RuntimeException または Error のサブクラスではない Throwable のサブクラスは、チェック済み例外と見なされます。

(悪名高い) 有名な非チェック例外の古典的な例:

  • OutOfMemoryError(拡張Error);
  • StackOverflowError(拡張Error);
  • NullPointerException(拡張RuntimeException);
  • IllegalArgumentException(拡張RuntimeException);
  • などなど

と の唯一の実際の違いはErrorRuntimeException推定される重大度レベルであり、技術的な違いではなく「意味論的」な違いです。最終的には、どちらも同じように動作します。一部の IDE (Intellij IDEA が思い浮かびます) は、キャッチしErrorても再スローしないと怒鳴ります。

于 2013-01-07T13:42:47.307 に答える
7

クラスを拡張する (実装しない) オブジェクトを確実にスローできErrorます。

あなたが言ったように、Error回復不能なエラーのために存在します。最も広範に使用Errorされるのは、メモリ不足など、回復できず、回復できるとは思われないものに対して のサブクラスを使用する JVM 自体の内部です。

于 2013-01-07T13:20:38.650 に答える
5

エラーのjavadocは言う

Error は、Throwable のサブクラスであり、合理的なアプリケーションがキャッチしようとすべきではない重大な問題を示します。このようなエラーのほとんどは異常な状態です。

一方、例外の場合、javadoc は言う

クラス Exception とそのサブクラスは、合理的なアプリケーションがキャッチする可能性がある条件を示す Throwable の形式です。

いくつかの違い

  1. エラーはキャッチされることを意図したものではありません。エラーをキャッチしても、そこから回復することはできません。たとえば、OutOfMemoryError中にキャッチすると、最初に GC がメモリを解放できない可能性があるため、再度エラーが発生します。一方、例外は適切にキャッチして処理できます。
  2. エラーは本質的に致命的であることが多く、エラーからの回復は不可能です。これは例外の場合とは異なり、すべての場合で致命的ではない可能性があります。Javaのエラーと例外の違い
  3. エラーとは異なり、例外は一般に、チェックされた例外とチェックされていない例外の 2 つのカテゴリに分類されます。Checked Exception は Java プログラミング言語で特別な位置を占めており、それを処理するには必須の try catch finally コード ブロックが必要です。一方、RuntimeException のサブクラスである Unchecked Exception は、主にプログラミング エラーを表します。非チェック例外の最も一般的な例は、Java の NullPointerException です。
  4. unchecked Exception と同様に、Java の Error も unchecked です。try catch または finally ブロックで処理されたエラーが表示されない場合、コンパイラはコンパイル時エラーをスローしません。実際、エラーからの回復はほとんど不可能であるため、エラーを処理することは良い考えではありません。

以上が Java のエラーと例外の違いです。覚えておくべき重要な点は、エラーは本質的に致命的であり、回復が不可能な場合があるということです。一方、例外を慎重に処理することで、コードをより堅牢にし、さまざまなシナリオから保護することができます。

それぞれの javadoc から取得した、Error のサブクラスのいくつかを見てください。

AnnotationFormatError - 注釈パーサーがクラス ファイルから注釈を読み取ろうとして、注釈の形式が正しくないと判断した場合にスローされます。

AssertionError - アサーションが失敗したことを示すためにスローされます。

LinkageError - LinkageError のサブクラスは、あるクラスが別のクラスに依存していることを示します。ただし、後者のクラスは、前者のクラスのコンパイル後に非互換に変更されています。

VirtualMachineError - Java 仮想マシンが壊れているか、動作を継続するために必要なリソースが不足していることを示すためにスローされます。

于 2013-01-07T13:46:11.717 に答える
3

エラードキュメントから:

Error は、Throwable のサブクラスであり、適切なアプリケーションがキャッチしようとすべきではない重大な問題を示します。

および例外ドキュメント:

クラス Exception とそのサブクラスは、適切なアプリケーションがキャッチする可能性がある条件を示す Throwable の形式です。

これで区別が明確になったと思います。どちらも throwable を継承しているため、両方をスローできることにも注意してください。

于 2013-01-07T13:22:00.710 に答える