ホームページ >Java >&#&チュートリアル >Java例外とは何ですか? Javaの例外はどのように処理されるのでしょうか?
この記事の内容は、Java 例外とは何ですか? Javaの例外はどのように処理されるのでしょうか?困っている友人は参考にしていただければ幸いです。
1. JAVA 例外
例外とは、ファイルが見つからない、ネットワーク接続の失敗、不正なパラメータなどのさまざまな予期しない状況を指します。 。例外は、プログラムの実行中に発生し、通常の命令フローを妨げるイベントです。 Java は、API の Throwable クラスの多数のサブクラスを通じてさまざまな例外を記述します。したがって、Java 例外は、コーディングの一部で発生するエラー条件を記述するオブジェクト、つまり Throwable サブクラスのインスタンスです。 Error は、条件が生成されたときに例外をスローします。
Java 例外クラス階層図:
Throwable: 2 つあります。 2 つの重要なサブクラス: Exception と Error。どちらも Java 例外処理の重要なサブクラスであり、それぞれに多数のサブクラスが含まれています。
エラー: はプログラムが処理できないエラーで、アプリケーションの実行に重大な問題があることを示しています。ほとんどのエラーは、コード作成者が実行したアクションとは何の関係もなく、コードの実行中の JVM (Java 仮想マシン) の問題を表します。たとえば、Java 仮想マシンの実行エラー (Virtual MachineError) では、操作の実行を継続するために必要なメモリ リソースが JVM になくなったときに、OutOfMemoryError が発生します。これらの例外が発生すると、Java 仮想マシン (JVM) は通常、スレッドを終了することを選択します。
例外: は、プログラム自体が処理できる例外です。
Java 例外 (例外およびエラーを含む) は、 チェック可能例外 (チェック例外) と非チェック例外 (未チェック例外) に分類されます。
チェック可能な例外 (コンパイラーが処理する必要がある例外): 発生しやすく、正しいプログラムが実行されている場合には許容できる例外。チェック可能な例外は異常事態ではありますが、その発生はある程度予測可能であり、異常事態が発生した場合には何らかの対処が必要となります。
RuntimeException とそのサブクラスを除き、他の Exception クラスとそのサブクラスはチェック可能な例外です。 この種の例外の特徴は、Java コンパイラがそれをチェックすることです。つまり、この種の例外がプログラム内で発生する可能性がある場合、try-catch ステートメントを使用してそれをキャプチャするか、throws を使用します。句を使用してそれを宣言しないと、コンパイラは通過しません。
チェックできない例外 (コンパイラーが強制処理を必要としない例外): 実行時例外 (RuntimeException とそのサブクラス) およびエラー (Error) が含まれます。
注: 例外はプログラム自体で処理できますが、エラーは処理できません。
#例外 この例外は、実行時例外と非実行時例外 (コンパイル例外) の 2 つの主要なカテゴリに分類されます。 プログラムはこれらの例外を可能な限り処理する必要があります。
ランタイム例外: は、NullPointerException (null ポインター例外)、IndexOutOfBoundsException (添え字 Out など)、RuntimeException クラスとそのサブクラスの例外です。 -of-bounds 例外) など。これらの例外はチェックされていない例外であり、プログラムでキャプチャするか、処理しないかを選択できます。これらの例外は通常、プログラムの論理エラーによって発生するため、プログラムは論理的な観点からこのような例外の発生を回避するように努める必要があります。
ランタイム例外の特徴は、Java コンパイラーがそれをチェックしないことです。つまり、このタイプの例外がプログラム内で発生する可能性がある場合、たとえ try-catch ステートメントで捕捉されなかったとしても、 throws 句で宣言されていない場合は、コンパイルされます。
非実行時例外 (コンパイル例外): は RuntimeException 以外の例外であり、すべての型は Exception クラスとそのサブクラスに属します。プログラムの構文の観点からは、これは処理する必要がある例外であり、処理されない場合、プログラムはコンパイルされません。 IOException、SQLException など、およびユーザー定義の例外 通常、カスタムのチェック例外は必要ありません。
2. 例外を処理するメカニズム
Java アプリケーションの例外処理メカニズムは次のとおりです: 例外のスロー、キャッチ例外。
例外をスローします: メソッドでエラーが発生し、例外がスローされると、メソッドは現在のシステムでは、例外オブジェクトには、例外の種類や例外発生時の例外ステータスなどの情報が含まれています。ランタイム システムは、例外を処理するコードを見つけて実行する責任があります。
例外のキャッチ: メソッドが例外をスローした後、ランタイム システムは適切な例外ハンドラー (例外ハンドラー) を探します。潜在的な例外ハンドラーは、発生する例外です。コールスタックに順番に残るメソッドのコレクション。例外ハンドラーが処理できる例外の種類が、メソッドによってスローされる例外の種類と一致する場合、それは適切な例外ハンドラーです。ランタイム システムは、例外が発生したメソッドから開始し、適切な例外ハンドラーを含むメソッドを見つけて実行するまで、コール スタック内のメソッドをチェックバックします。ランタイム システムがコール スタックを走査し、適切な例外ハンドラーが見つからない場合、ランタイム システムは終了します。同時に、Java プログラムが終了することを意味します。
ランタイム例外はチェックできない性質があるため、アプリケーションをより合理的かつ簡単に実装するために、Java ではランタイム例外が Java ランタイム システムによって自動的にスローされ、アプリケーションがランタイム例外を無視できるようにすることが規定されています。
メソッドの実行中に発生する可能性のあるエラー。実行中のメソッドがそれをキャッチしたくない場合、Java ではメソッドがスロー ステートメントを作成しないようにします。なぜなら、ほとんどのエラー例外は決して発生してはいけない状況であり、合理的なアプリケーションがキャッチすべきではない例外だからです。
すべてのチェック可能な例外について、Java では次のように規定されています: メソッドは例外をキャッチするか、メソッドの外でスローされるように宣言する必要があります。つまり、メソッドがチェック可能な例外をキャッチしないことを選択した場合、例外をスローすることを宣言する必要があります。
一般に、Java では、チェック可能な例外はキャッチされるか、スローされると宣言される必要があると規定されています。チェックできない RuntimeException および Error を無視できるようにします。
#3. 例外のキャッチ: 試してキャッチし、最後に
1.try-catch ステートメント
キーワード try の後の中括弧のペア例外が発生する可能性のあるコード部分は監視領域と呼ばれます。 Java メソッドの実行中に例外が発生すると、例外オブジェクトが作成されます。例外は監視領域の外にスローされ、Java ランタイム システムは例外をキャッチするために一致する catch 句を見つけようとします。一致する catch 句がある場合、その例外処理コードが実行され、try-catch ステートメントが終了します。プログラムの実行は続行されます。 一致の原則は次のとおりです。スローされた例外オブジェクトが catch 句の例外クラスに属しているか、例外クラスのサブクラスに属している場合、生成された例外オブジェクトは、キャッチブロック。 実行時例外をキャッチしたり宣言したりしないでください。プログラムは例外をスローし、操作を終了します。 #キャッチが一致する例外タイプをキャッチすると、例外処理コードが入力されます。処理が完了すると、try-catch ステートメント全体が終了したことになります。他の catch 句では、例外タイプを照合してキャッチする機会がなくなりました。低レベルの例外クラスをキャプチャする catch 句を前面に配置し、比較的高レベルの例外クラスをキャプチャする catch 句を背面に配置するようにしてください。そうしないと、基になる例外クラスをキャプチャする catch 句がブロックされる可能性があります。2.try-catch-finally
try-catch ステートメントには、finally 句である 3 番目の部分を含めることもできます。例外が発生したかどうかに関係なく実行すべき内容を示します。 try-catch-finally ステートメントの一般的な構文形式は次のとおりです。try ブロック: は、例外をキャッチするために使用されます。この後には 0 個以上の catch ブロックを続けることができます。catch ブロックがない場合は、finally ブロックを続ける必要があります。
catch ブロック: は、try によってキャッチされた例外を処理するために使用されます。
finally ブロック: finally ブロック内のステートメントは、例外がキャッチされたか処理されたかに関係なく実行されます。 try ブロックまたは catch ブロック内で return ステートメントが見つかった場合、メソッドが戻る前に、finally ステートメント ブロックが実行されます。次の 4 つの特殊な状況では、finally ブロックは実行されません。
1)finally ステートメント ブロックで例外が発生します。2) System.exit() は、プログラムを終了するために前のコードで使用されています。
3) プログラムが存在するスレッドが停止します。
4) CPU の電源をオフにします。
3. try-catch-finally ルール ( 例外処理ステートメントの文法ルール):
#1) try の後に catch またはfinally ブロックを追加する必要があります。 try ブロックの後には catch ブロックとfinally ブロックの両方を続けることができますが、少なくとも 1 つのブロックが必要です。 2) ブロックの順序に従う必要があります。コードで catch ブロックとfinally ブロックの両方を使用する場合は、catch ブロックを try ブロックの後に配置する必要があります。 3) catch ブロックは、対応する例外クラスのタイプに関連しています。4) try ブロックには複数の catch ブロックが含まれる場合があります。そうであれば、最初に一致したブロックが実行されます。つまり、Java 仮想マシンは、実際にスローされた例外オブジェクトを、各キャッチ コード ブロックで宣言された例外タイプと順番に照合します。例外オブジェクトが特定の例外タイプまたはそのサブクラスのインスタンスである場合、キャッチ コード ブロックが実行されます。 catch コード ブロック
#5) try-catch-finally 構造はネストできます。 6) try-catch-finally 構造では、例外を再スローできます。7) 以下の状況を除いて、final は常に最後として実行されます。
JVM が途中で終了します (System.exit(int) を呼び出します)。コンピュータの電源が入っているときに、未処理の例外がスローされます。オフ、火災またはウイルス攻撃。
4. try、catch、finally ステートメント ブロックの実行順序:
1) try が例外をキャッチしない場合: try ステートメント ブロック内のステートメントが 1 つずつ実行され、プログラムは catch ステートメント ブロックをスキップして、finally ステートメント ブロックと後続のステートメントを実行します。 #2) try の場合 例外がキャッチされ、catch ステートメント ブロックで例外が処理されない場合: try ステートメント ブロック内のステートメントで例外が発生し、例外を処理する catch ステートメント ブロックがない場合、例外がスローされます。処理のために JVM に送信、finally ステートメント ブロック内のステートメントは引き続き実行されますが、finally ステートメント ブロックの後のステートメントは実行されません。3) try が例外をキャッチすると、次のような状況が発生します。 catch ステートメント ブロックで例外を処理します。try ステートメント ブロック内が順番に実行されます。あるステートメントの実行時に例外が発生すると、プログラムは catch ステートメント ブロックにジャンプし、catch ステートメント ブロックを 1 つずつ照合して検索します。他の catch ステートメント ブロックは実行されず、try ステートメント ブロックでは、catch ステートメント ブロックが実行された後、finally ステートメント ブロック内のステートメントが実行されます。 finally ステートメント ブロックの後のステートメントが実行されます。 図は、try、catch、finally ステートメント ブロックの実行を示しています。##5. 例外のスロー
#Java コードは次のような例外をスローできます。自分で書いたコード、コードJava 開発環境パッケージ、または Java ランタイム システムから。誰でも Java の throw ステートメントを通じて例外をスローできます。メソッドからスローされる例外はすべて throws 節を使用する必要があります。1. throws は例外をスローします
メソッドが例外を引き起こす可能性があるが、その能力がない場合これを処理するには、メソッド宣言で throws 句を使用して例外を宣言できます。メソッド名の後の throws Exception1、Exception2、...、ExceptionN は、スローされる例外のリストです。メソッドが例外リストから例外をスローする場合、メソッドはこれらの型およびそのサブクラス型の例外を処理しませんが、処理のためにメソッドを呼び出すメソッドにスローされます。
例外をスローするためのルールをスローします:
1) チェックされていない例外、つまり Error、RuntimeException、またはそのサブクラスの場合、 throws キーワードを使用せずに例外をスローするように宣言することもできますが、コンパイルはスムーズに実行されますが、実行時にシステムによってスローされます。 2) メソッドがスローできるチェック例外はすべて宣言する必要があります。つまり、メソッドにチェック可能な例外がある可能性がある場合は、try-catch ステートメントを使用してそれをキャッチするか、throws 句ステートメントを使用して例外をスローします。そうしないと、コンパイル エラーが発生します。3) 次の場合にのみ例外がスローされた場合、このメソッドの呼び出し元のみが例外を処理または再スローする必要があります。メソッドの呼び出し元が例外を処理できない場合、例外をスローし続ける必要があります。#4) 呼び出し元のメソッドは、チェック可能な例外の処理規則と宣言規則に従う必要があります。メソッドをオーバーライドする場合、オーバーライドされたメソッドとは異なる例外を宣言することはできません。宣言された例外は、オーバーライドされたメソッドによって宣言された例外と同じクラスまたはサブクラスである必要があります。
#メソッド内で例外が発生する可能性があるかどうかの判断基準は次のとおりです。 #1)メソッド内に throw ステートメントがあります。
#2) 他のメソッドが呼び出され、他のメソッドは throws 句を使用して、何らかの例外をスローすることを宣言します。 取得した例外をすべてのメソッドがレイヤーごとにスローすると、最終的には JVM がそれを処理しますが、その処理も例外メッセージとスタック情報を出力するだけで非常に簡単です。 Error または RuntimeException がスローされた場合、メソッドの呼び出し元は例外を処理することを選択できます。
#2. Throwable クラスでよく使用されるメソッド
getCause(): 例外をスローした理由を返します。原因が存在しない、または不明な場合は null が返されます。 getMeage(): 異常メッセージ情報を返します。 printStackTrace(): オブジェクトのスタック トレースは、フィールド System.err の値としてエラー出力ストリームに出力されます。 6. Java の一般的な例外 Java では、頻繁に発生するエラーを説明するために、プログラマがキャプチャ処理を実行するか、スローを宣言する必要がある例外をいくつか提供しています。 、一部は Java 仮想マシンによって自動的にキャプチャされます。 Java の一般的な例外クラス: 1. runtimeException サブクラス: (未チェック例外) 配列インデックスが範囲外の例外。配列のインデックスが負の場合、または配列サイズ以上の場合にスローされます。 算術条件例外。例: 整数のゼロ除算など。 Null ポインタ例外。この例外は、アプリケーションがオブジェクトが必要な場所で null を使用しようとするとスローされます。例: null オブジェクトのインスタンス メソッドの呼び出し、null オブジェクトのプロパティへのアクセス、null オブジェクトの長さの計算、throw ステートメントを使用した null のスローなど。 未満のクラス例外を検索します。この例外は、アプリケーションが文字列形式のクラス名に基づいてクラスを構築しようとしたが、CLASSPAH を走査した後に対応する名前のクラス ファイルが見つからなかった場合にスローされます。 IOException(チェック例外)IOException: 入力ストリームおよび出力ストリームの動作が異常な場合に発生する可能性があります。 EOFException ファイル終了例外 FileNotFoundException ファイルが見つからない例外 3. その他 ClassCastException タイプ変換例外クラスArrayStoreException 配列に互換性のない値が含まれている場合にスローされる例外 SQLException 操作データベース例外クラス NoSuchFieldException フィールドが見つかりません例外 NoSuchMethodException スローされる例外メソッドが見つかりません NumberFormatException 文字列を数値に変換することによってスローされる例外 StringIndexOutOfBoundsException 範囲外の文字列インデックスによってスローされる例外 IllegalAccessException アクセスは許可されません。例外のタイプ InstantiationException この例外は、アプリケーションが Class クラスの newInstance() メソッドを使用してクラスのインスタンスを作成しようとしたが、指定されたクラス オブジェクトをインスタンス化できない場合にスローされます 4. カスタム例外 Java の組み込み例外クラスを使用すると、プログラミング中に発生するほとんどの例外を記述することができます。さらに、ユーザーは例外をカスタマイズすることもできます。ユーザー定義の例外クラスは、Exception クラスを継承するだけで済みます。 プログラム内でカスタム例外クラスを使用する手順は、大まかに次の手順に分かれます。 (1) カスタム例外クラスを作成します。 (3) 現在例外をスローしているメソッドで例外が処理される場合は、try-catch ステートメントを使用して例外をキャプチャして処理できます。それ以外の場合は、メソッドの宣言で throws キーワードを使用して例外を示します。メソッドの呼び出し元にスローされ、続行します。次のステップに進みます。 、ブートストラップ ビデオ チュートリアルをご覧ください。
##2.
(4) 例外メソッドの呼び出し元で例外をキャッチして処理します。
要約: 以上がこの記事の全内容です。皆さんの学習に役立つことを願っています。関連チュートリアルの詳細については、
Java ビデオ チュートリアル
、
以上がJava例外とは何ですか? Javaの例外はどのように処理されるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。