例外処理 Java におけるこれは、アプリケーションの通常のフローを維持できるようにランタイム エラーを処理する効果的な手段の 1 つです。 Java 例外処理は、ClassNotFoundException、IOException、SQLException、RemoteException などの実行時エラーを処理するメカニズムです。
Java例外とは何ですか?
Javaでは例外 プログラムの実行中、つまり実行時に発生し、プログラムの命令の通常の流れを中断する、望ましくない、または予期しないイベントです。例外はプログラムによってキャッチされ、処理されます。メソッド内で例外が発生すると、オブジェクトが作成されます。このオブジェクトは例外オブジェクトと呼ばれます。これには、例外の名前と説明、例外が発生したときのプログラムの状態など、例外に関する情報が含まれます。
例外が発生する主な理由
- 無効なユーザー入力
- 装置の故障
- ネットワーク接続の切断
- 物理的な制限 (ディスクメモリ不足)
- コードエラー
- 使用できないファイルを開く
エラー これは、Java 仮想マシン (JVM) のメモリ不足、メモリ リーク、スタック オーバーフロー エラー、ライブラリの非互換性、無限再帰などの回復不能な状態を表します。エラーは通常、プログラマの制御の範囲を超えており、エラーを処理しようとすべきではありません。
エラーと例外の違い
最も重要な部分について説明しましょう。 エラーと例外の違い それは次のとおりです。
- エラー: エラーは、適切なアプリケーションが検出すべきではない重大な問題を示します。
- 例外: 例外は、適切なアプリケーションがキャッチしようとする可能性のある条件を示します。
例外階層
すべての例外およびエラーのタイプは、クラスのサブクラスです。 投擲可能 、これは階層の基本クラスです。ある支部を率いるのは、 例外 。このクラスは、ユーザー プログラムが捕捉する必要がある例外条件に使用されます。 NullPointerException は、そのような例外の例です。別の支店では、 エラー Java ランタイム システム ( JVM ) は、ランタイム環境自体 (JRE) に関連するエラーを示します。 StackOverflowError は、このようなエラーの例です。

Javaの例外階層
例外の種類
Java では、さまざまなクラス ライブラリに関連するいくつかのタイプの例外が定義されています。 Java では、ユーザーが独自の例外を定義することもできます。
例外は次の 2 つの方法で分類できます。
- 組み込みの例外
- チェックされた例外
- 未チェックの例外
- ユーザー定義の例外
上記で定義した次のような例外について説明します。
1. 組み込みの例外
組み込み例外は、Java ライブラリで使用できる例外です。これらの例外は、特定のエラー状況を説明するのに適しています。
- チェックされた例外: チェックされた例外は、コンパイラによってコンパイル時にチェックされるため、コンパイル時例外と呼ばれます。
- 未チェックの例外: 非チェック例外は、チェック例外のちょうど反対です。コンパイラはコンパイル時にこれらの例外をチェックしません。簡単に言うと、プログラムがチェックされていない例外をスローした場合、たとえそれを処理したり宣言しなかったとしても、プログラムはコンパイル エラーを出しません。
注記: チェック済み例外と未チェック例外については、を参照してください。 チェックされた例外とチェックされていない例外
2. ユーザー定義の例外:
Java の組み込み例外では特定の状況を説明できない場合があります。このような場合、ユーザーは「ユーザー定義例外」と呼ばれる例外を作成することもできます。
の Java における例外処理の利点 以下の通り:
- プログラム実行を完了するための準備
- プログラムコードとエラー処理コードを簡単に識別
- エラーの伝播
- 意味のあるエラー報告
- エラーの種類の特定
例外情報を出力するメソッド:
1. printStackTrace()
このメソッドは、例外の名前: 例外の説明、スタック トレースの形式で例外情報を出力します。
例:
PowerShell の Runas
ジャワ
//program to print the exception information using printStackTrace() method> > import> java.io.*;> > class> GFG {> >public> static> void> main (String[] args) {> >int> a=>5>;> >int> b=>0>;> >try>{> >System.out.println(a/b);> >}> >catch>(ArithmeticException e){> >e.printStackTrace();> >}> >}> }> |
>
>
出力
java.lang.ArithmeticException: / by zero at GFG.main(File.java:10)>
2.toString()
toString() メソッドは、例外の名前: 例外の説明の形式で例外情報を出力します。
例:
ジャワ
//program to print the exception information using toString() method> > import> java.io.*;> > class> GFG1 {> >public> static> void> main (String[] args) {> >int> a=>5>;> >int> b=>0>;> >try>{> >System.out.println(a/b);> >}> >catch>(ArithmeticException e){> >System.out.println(e.toString());> >}> >}> }> |
>
>
出力
java.lang.ArithmeticException: / by zero>
3.getMessage()
getMessage() メソッドは、例外の説明のみを出力します。
例:
ジャワ
//program to print the exception information using getMessage() method> > import> java.io.*;> > class> GFG1 {> >public> static> void> main (String[] args) {> >int> a=>5>;> >int> b=>0>;> >try>{> >System.out.println(a/b);> >}> >catch>(ArithmeticException e){> >System.out.println(e.getMessage());> >}> >}> }> |
>
>
出力
/ by zero>
JVM は例外をどのように処理するのでしょうか?
デフォルトの例外処理: メソッド内で例外が発生すると、メソッドは例外オブジェクトとして知られるオブジェクトを作成し、それをランタイム システム (JVM) に渡します。例外オブジェクトには、例外の名前と説明、および例外が発生したプログラムの現在の状態が含まれます。例外オブジェクトを作成してランタイム システムで処理することを、例外のスローと呼びます。例外が発生したメソッドに到達するために呼び出されたメソッドのリストが存在する場合があります。このメソッドの順序付きリストは次のように呼ばれます。 コールスタック 。ここで、次の手順が実行されます。
- ランタイム システムはコール スタックを検索して、発生した例外を処理できるコード ブロックを含むメソッドを見つけます。コードのブロックは と呼ばれます。 例外ハンドラ 。
- ランタイム システムは、例外が発生したメソッドから検索を開始し、メソッドが呼び出された逆の順序でコール スタックを処理します。
- 適切なハンドラーが見つかった場合は、発生した例外をそのハンドラーに渡します。適切なハンドラーとは、スローされる例外オブジェクトのタイプが、処理できる例外オブジェクトのタイプと一致することを意味します。
- ランタイム システムがコール スタック上のすべてのメソッドを検索し、適切なハンドラーが見つからなかった場合、ランタイム システムは例外オブジェクトをハンドラーに引き渡します。 デフォルトの例外ハンドラ 、これはランタイム システムの一部です。このハンドラは、次の形式で例外情報を出力し、プログラムを終了します。 異常に 。
Exception in thread 'xxx' Name of Exception : Description ... ...... .. // Call Stack>
コールスタックの流れを理解するには、以下の図を見てください。
図:
ジャワ
ミア・ハリファの年齢
// Java Program to Demonstrate How Exception Is Thrown> > // Class> // ThrowsExecp> class> GFG {> > >// Main driver method> >public> static> void> main(String args[])> >{> >// Taking an empty string> >String str =>null>;> >// Getting length of a string> >System.out.println(str.length());> >}> }> |
>
>
出力
ランタイム システムがコール スタック上で適切な例外処理コードを検索する方法を示す例を見てみましょう。
例:
ジャワ
// Java Program to Demonstrate Exception is Thrown> // How the runTime System Searches Call-Stack> // to Find Appropriate Exception Handler> > // Class> // ExceptionThrown> class> GFG {> > >// Method 1> >// It throws the Exception(ArithmeticException).> >// Appropriate Exception handler is not found> >// within this method.> >static> int> divideByZero(>int> a,>int> b)> >{> > >// this statement will cause ArithmeticException> >// (/by zero)> >int> i = a / b;> > >return> i;> >}> > >// The runTime System searches the appropriate> >// Exception handler in method also but couldn't have> >// found. So looking forward on the call stack> >static> int> computeDivision(>int> a,>int> b)> >{> > >int> res =>0>;> > >// Try block to check for exceptions> >try> {> > >res = divideByZero(a, b);> >}> > >// Catch block to handle NumberFormatException> >// exception Doesn't matches with> >// ArithmeticException> >catch> (NumberFormatException ex) {> >// Display message when exception occurs> >System.out.println(> >'NumberFormatException is occurred'>);> >}> >return> res;> >}> > >// Method 2> >// Found appropriate Exception handler.> >// i.e. matching catch block.> >public> static> void> main(String args[])> >{> > >int> a =>1>;> >int> b =>0>;> > >// Try block to check for exceptions> >try> {> >int> i = computeDivision(a, b);> >}> > >// Catch block to handle ArithmeticException> >// exceptions> >catch> (ArithmeticException ex) {> > >// getMessage() will print description> >// of exception(here / by zero)> >System.out.println(ex.getMessage());> >}> >}> }> |
>
>出力
/ by zero>
プログラマーはどのように例外を処理するのでしょうか?
カスタマイズされた例外処理: Java 例外処理は、次の 5 つのキーワードによって管理されます。 試す 、 キャッチ 、 投げる 、 投げる 、 そして ついに 。簡単に説明すると、これらの仕組みは次のとおりです。例外を発生させる可能性があると思われるプログラム ステートメントは、try ブロック内に含まれています。 try ブロック内で例外が発生した場合、例外がスローされます。コードは (catch ブロックを使用して) この例外をキャッチし、合理的な方法で処理できます。システム生成の例外は、Java ランタイム システムによって自動的にスローされます。手動で例外をスローするには、キーワード throw を使用します。メソッドからスローされる例外はすべて、throws 節で例外として指定する必要があります。 try ブロックの完了後に必ず実行する必要があるコードはすべて、finally ブロックに配置されます。
ヒント: 必ず通過しなければならない 理解を深めるために、try catchfinally ブロックの制御フローを説明します。
try-catch句の必要性(カスタマイズされた例外処理)
try-catch 節をより深く理解するために、以下のプログラムを考えてみましょう。
例:
ジャワ
隠れたアプリを表示する
// Java Program to Demonstrate> // Need of try-catch Clause> > // Class> class> GFG {> > >// Main driver method> >public> static> void> main(String[] args)> >{> >// Taking an array of size 4> >int>[] arr =>new> int>[>4>];> > >// Now this statement will cause an exception> >int> i = arr[>4>];> > >// This statement will never execute> >// as above we caught with an exception> >System.out.println(>'Hi, I want to execute'>);> >}> }> |
>
>
出力
出力の説明: 上記の例では、配列はサイズで定義されています。つまり、インデックス 0 から 3 までの要素にのみアクセスできます。しかし、(誤って) インデックス 4 の要素にアクセスしようとしているため、例外がスローされます。この場合、JVM はプログラムを終了します。 異常に 。ステートメント System.out.println(こんにちは、実行したいです);決して実行されません。これを実行するには、try-catch を使用して例外を処理する必要があります。したがって、プログラムの通常の流れを継続するには、try-catch 節が必要です。
Try-catch 句の使用方法
try { // block of code to monitor for errors // the code you think can raise an exception } catch (ExceptionType1 exOb) { // exception handler for ExceptionType1 } catch (ExceptionType2 exOb) { // exception handler for ExceptionType2 } // optional finally { // block of code to be executed after try block ends }> 次のような重要なポイントを覚えておく必要があります。
- メソッド内には、例外をスローする可能性のあるステートメントが複数存在する可能性があるため、これらのステートメントはすべて独自のステートメント内に配置してください。 試す をブロックし、独自の例外ハンドラー内に別個の例外ハンドラーを提供します。 キャッチ それぞれにブロックします。
- 範囲内で例外が発生した場合、 試す ブロックに関連付けられた例外は、それに関連付けられた例外ハンドラーによって処理されます。例外ハンドラーを関連付けるには、 キャッチ その後はブロックします。複数の例外ハンドラーが存在する場合があります。それぞれ キャッチ block は、引数で指定された型に対する例外を処理する例外ハンドラーです。引数 ExceptionType は、処理できる例外のタイプを宣言し、それを継承するクラスの名前である必要があります。 投擲可能 クラス。
- Try ブロックごとに、0 個以上の catch ブロックを含めることができますが、 唯一 最後のブロック。
- Finally ブロックはオプションです。 try ブロックで例外が発生したかどうかに関係なく、常に実行されます。例外が発生した場合は、その後に実行されます。 ブロックをキャッチしてみてください。 例外が発生しない場合は、例外が実行された後に実行されます。 試す ブロック。 Java のfinally ブロックは、ファイルを閉じる、接続を閉じるなどのクリーンアップ コードなどの重要なコードを配置するために使用されます。
- try ブロックに System.exit を記述すると、finally ブロックは実行されません。
概要は次のように視覚的に示されています。
関連記事:
- Java の例外の種類
- チェックされた例外とチェックされていない例外
- Java のスロースロー
関連コース
Java プログラミング基礎 – マイペース コース
長年の経験を持つ業界専門家から、Java プログラミング基礎の学習を始めるのに最適なコースを見つけてください。これ Java プログラミング基礎 – マイペース コース の基本をカバーしています。 Java プログラミング言語、データ型、演算子とフロー制御、ループ、文字列 などなど。もう待つ必要はありません。今すぐ Java の学習を始めて、完全な Java エンジニアになりましょう!