この記事の例では、Java 例外処理の使用法について説明します。皆さんの参考に共有してください。具体的な分析は次のとおりです。
Java の例外処理メカニズムは、プログラム内で発生する可能性のあるエラーを回避または処理するのに役立ちます。これにより、回復可能なエラーが発生したときにプログラムが予期せず終了することがなくなりますが、これらのエラーを処理することで、プログラムの作成が向上することもあります。エラー状態をチェックするために大量のコードを記述する必要があるため、コードの可読性とロジックが向上します。 Java では、例外は不正なエンティティ オブジェクトを表します。
例外は 2 つのカテゴリに分類できます。1 つはハードウェア エラー、メモリ不足などの重大なエラーで、java.lang パッケージの Error クラスとそのサブクラスに対応します。通常、このタイプのエラーはプログラム自体を回復できず、プログラムの実行を中断する必要があります。もう 1 つのタイプは、ユーザーによる不正なデータの入力、0 による除算などの重大ではないエラーです。これらは例外クラスとjava.lang パッケージの例外を使用すると、この種のエラーは通常、プログラムの動作に影響を与えることなく回復できます。
try、catch、finally キーワードを使用して例外をキャッチできます。
1. 試して捕まえる
例外を引き起こす可能性のあるステートメントを try{} ブロックに配置し、それを catch{} ステートメント ブロックでキャッチします。 0で割った場合は例外:
public class SimpleDemo { //除算演算 public static int devision(int a,int b) { return a / b; } public static void main(String[] args) { try { //5 を 0 で除算する SimpleDemo.devision(5) ,0); System.out.println("例外"); } catch (例外 e) { e.printStackTrace() } }実行結果:
ご覧のとおり、「Finish」が出力され、プログラムが 0 による除算エラーによって終了しなかったことを示します。
同時に、例外が発生した SimpleDemo.devision() 内の System.out.println ステートメントが実行されていないことも判明しました。例外が発生すると、プログラムは例外に続くステートメントを実行せずに、現在の実行位置から飛び出します。
2.ついに
finally ブロック内のステートメントは、例外が発生したかどうかに関係なく実行されます。
例外が発生するかどうかに関係なく、finally ブロック内のステートメントが実行されるため、finally の実際的な効果は何なのかと疑問に思う人もいるかもしれません。 finallyを使わずに直接外に書くことはできないのでしょうか?
上の例と同様に、catch ステートメント ブロックに return を追加します。
public class SimpleDemo { //除算演算 public static int Division(int a,int b) { return a / b; } public static void main(String[] args) { try { //5 を 0 で割る SimpleDemo.division(5) ,0); System.out.println("Exception"); } catch (Exception e) { e.printStackTrace(); return; System.out.println("最後に");このとき、finally ブロックの外側の Finish は出力されませんが、finally ブロック内の Final は出力されます。
Final は実際の開発で非常に役立ちます。たとえば、データベースを開いて、データベース内のデータの読み取りおよび書き込み時に例外が発生した場合は、データベース接続を閉じて、対応するリソースを解放する必要があります。このとき、リソースを解放するコードをfinallyブロックに記述するのが最も適切です。
ただし、finally ブロックが実行されない場合があることに注意してください。 System.exit() メソッドを呼び出すなど、finally ブロックを実行する前にプログラムが終了した場合、finally ブロックは実行できません。
3. 例外をスローする
メソッド内で例外が発生したが、その例外をメソッド内で直接処理するのではなく、メソッドの呼び出し元に処理させたい場合は、 throws キーワードを使用してこのメソッドを宣言し、例外をスローすることができます。これは、Sun が提供する API 関数では非常に一般的です。たとえば、java.io.Reader の read メソッドは IOException をスローするように宣言されています。
public int read(char[] cbuf) は IOException をスローします
この時点で、read メソッドを呼び出すときは、例外をキャッチするために read メソッドを try ステートメント ブロックに含める必要があります。そうしないと、コンパイラによってエラーが報告され、強制的に例外をキャッチすることになります。
もちろん、read を呼び出すときに例外を処理したくない場合は、read メソッドを呼び出すメソッドを throws IOException として宣言し、例外が再度スローされるようにすることもできます。 main 関数で例外を宣言すると、最終的に例外情報は JVM によって取得されて処理され、JVM の処理結果は例外情報を出力してプログラムを終了します。
4. 例外処理構造
すべての例外クラスは、Exception クラスから派生します。これは、どのタイプの例外が発生するかわからない場合、catch で Exception オブジェクトを直接宣言して、Exception クラスとそのサブクラスのすべての例外をキャッチできることを意味します。ただし、catch を記述する順序に注意してください。 try の後に複数の catch があり、最初の catch で Exception オブジェクトが宣言されている場合、例外は最初の catch によって直接処理され、後続の catch はこの例外をキャッチできません。この種のエラーはコンパイル中にエラーを生成します。例えば:
public class CatchDemo { // 除算演算 public static int Division(int a,int b) { return a / b; } public static void main(String[] args) { try { CatchDemo.division(4,0) }; (例外 e) { System.out.println("例外クラス") } catch(ArithmeticException e) { System.out.println("ArithmeticException クラス"); } } }コンパイラーは、ArithmeticException がキャッチされたことを出力します。これは、上記の例外がこの例外をキャッチしたため、再度キャッチする必要がないことを意味します。
この 2 つのキャッチが逆になったらどうなるでしょうか?
public class CatchDemo { // 除算演算 public static int Division(int a,int b) { return a / b; } public static void main(String[] args) { try { CatchDemo.division(4,0) }; (ArithmeticException e) { System.out.println("ArithmeticException クラス") } catch(Exception e) { System.out.println("Exception クラス"); } } }この時点で、コードはコンパイルに合格し、実行結果は、ArithmeticException がこの例外をキャッチしましたが、後続の catch はキャッチしなかったことがわかりました。
この記事が皆さんの Java プログラミングに役立つことを願っています。