エラーは心配ですが、Java で書かないでください。おそらく、 Java の例外についてはすでにいくつかのことをご存じでしょう。今日は、少なくとも表面的な知識だけでも役に立ちます。Error クラスと、スタック トレースに表示されると多くの人を怖がらせる特別な例外タイプを分析します。

Java の例外階層の最上位にはThrowableクラスがあり、これには 2 つの子孫があります。

  • 例外: プログラム内のエラーの原因となります。
  • そして今日の主役は、JVM のエラーを担当するErrorです。
    これらはおそらくコーディングのバグでさえなく、通常は開発者に依存しない問題であることに言及する価値があります。

エラーが発生した場合の対処方法

「エラー」をキャッチするときは、 JVM 自体の問題について話しているため、catchブロックでは、logging以外のアクションを実行できません。

ログ記録は優れています。ランタイム エラーが発生した場合、ログを調べてその原因を確認し、何を修正すべきかを知ることができます。

コードを記述するときにどのような種類のエラーが発生するかわからないため、catchブロックに特定の型を記述することは意味がありません。Errorクラス自体を使用することも、この場合はエラーのみを検出するため、最善の解決策ではありません。

したがって、 ErrorExceptionの両方をキャッチできるThrowableクラスを使用することをお勧めします。これは実際にはどうなるでしょうか?

次のようなコードを書くことは許可されていません:

try {
    // Your code
} catch (OutOfMemoryError outOfMemoryError) {
    // Code to catch OutOfMemoryError
}
次のようなコードを書くのもOKではありません。

try {
    // Your code
} catch (Error error) {
    // Code to catch all Errors
}
ただし、次のようなコードは問題ありません。

try {
    // Your code
} catch (Throwable throwable) {
    // Code to catch all Throwables
}

エラーを処理するための 2 番目のオプションは、メソッドでthrows句を宣言した後、エラーをより高い位置にスローすることです。この手法は、コードが理論的にエラーをスローする可能性があり、コードを使用する可能性のあるすべての人がエラーを適切に処理できるように事前に警告したい場合に使用されます。

よくあるエラー

最も一般的なエラーには、OutOfMemoryErrorクラスとStackOverflowErrorクラスがあります。

OutOfMemoryError は、プログラムにオブジェクトを作成するのに十分なメモリがなく、ガベージ コレクターが追いつかない場合によく発生します。結果はOutOfMemoryErrorになります。

Java では、メモリ リークを防ぐためにオブジェクトを手動で削除することはできませんが、ガベージ コレクタの過負荷やヒープの乱雑さを避けるために、ポイ捨てを避けることができます。

たとえば、次のようなコードはメモリ内に大量のゴミを作成します。


while (true) {
    new Object();
}

2 番目のエラーについて説明したいのは、 StackOverflowError ですこれは、スタックがオーバーフローしたときにスローされます。スタックには主にローカル変数、パラメータ、およびメソッド呼び出しが格納されるため、再帰 (または再帰的メソッド呼び出し) がこのエラーの非常に一般的な原因となります。


public void foo() {
    foo();
}

プログラム実行時の問題を回避するために、最新の IDE ではメソッドの再帰呼び出しについて警告することがよくあります。

Errorsをスローするプログラムを修正することはできませんが、エラーをスローせずにプログラムを中断しないコードを書くことはできます。メモリの使い方に注意し、慎重にオブジェクトを作成し、メソッドを正しく呼び出してください。そうすれば、コード内での問題が少なくなります。

エラーと例外の種類の違い

エラー 例外
catchブロックでは修正できません catchブロックで扱える
コンパイル時には発生しません コンパイル時にキャッチできる
JVM の問題 コードロジックの問題
すべてのエラーはチェックされていませ チェックが入ったものチェックが外されたもの

Java では例外を回避することはできませんが、例外を恐れる必要はありません。必要なのは、各タイプが何を表すかを理解し、それを処理する方法を知ることだけです。それが今日のすべてです!またね!