JavaRush /Java Blog /Random-JA /例外とその処理
articles
レベル 15

例外とその処理

Random-JA グループに公開済み
例外または例外状況 (状態) は、プログラムの動作中に発生するエラーです。Java の例外はすべてオブジェクトです。したがって、例外的な状況が発生したときに自動的に生成されるだけでなく、開発者自身が作成することもできます。例外クラスの階層: 例外とその処理 - 1例外はいくつかのクラスに分割されますが、それらはすべて共通の祖先であるクラスを持っていますThrowable。その子孫はサブクラスExceptionとですError。例外 ( Exceptions) は、原則として解決可能かつ予測可能なプログラム内の問題の結果です。たとえば、ゼロによる除算は整数で発生します。エラー ( Errors) はより深刻な問題であり、Java 仕様では、JVM レベルの問題であるため、独自のプログラムで処理するべきではないと述べています。たとえば、この種の例外は、仮想マシンで使用できるメモリが不足した場合に発生します。プログラムはまだ JVM に追加のメモリを提供できません。Java では、すべての例外は 3 つのタイプに分類されます。チェック例外 ( checked) と、エラー ( ) と実行時例外 (クラスの子孫)uncheckedを含む非チェック例外 ( ) です。制御された例外は、プログラム内で処理できる、または処理する必要があるエラーです。クラスのすべての子孫(ただし、 ではありません) はこのタイプに属します。例外処理は演算子を使用して実行することも、プログラムの外部部分に転送することもできます。たとえば、メソッドは、メソッド内で発生した例外を、それ自体を処理せずに呼び出し階層の上位に渡すことができます。チェックされていない例外は処理する必要はありませんが、必要に応じてクラス例外を処理できます。次のプログラムをコンパイルして実行してみましょう。 ErrorsRuntimeExceptionsExceptionExceptionRuntimeExceptiontry…catchRuntimeException
class Main {
     public static void main(String[] args) {
         int a = 4;
         System.out.println(a/0);
     }
}
起動すると、コンソールに次のメッセージが表示されます。
Exception in thread "main" java.lang.ArithmeticException: / by zero
        at Main.main(Main.java:4)
メッセージには、発生した例外のクラスが表示されますArithmeticException。この例外は次のように処理できます。
class Main {
     public static void main(String[] args) {
         int a = 4;
         try {
              System.out.println(a/0);
         } catch (ArithmeticException e) {
              System.out.println("Произошла недопустимая арифметическая операция");
         }
     }
}
ここで、標準のエラー メッセージの代わりに、ブロックが実行されますcatch。そのパラメータは、例外に対応するクラスのオブジェクト e です (オブジェクト自体には任意の名前を付けることができます。強制的にスローしたい場合に必要になります)たとえば、他のハンドラーがチェックされるように、この例外を再度実行します)。この場合、ブロックtryには例外が発生する可能性のあるプログラムのフラグメントが含まれています。try異なる例外クラスを持つ複数の catch ブロックに対応できます 。
import java.util.Scanner;
class Main {
    public static void main(String[] args) {
     int[] m = {-1,0,1};
        Scanner sc = new Scanner(System.in);
        try {
            int a = sc.nextInt();
            m[a] = 4/a;
            System.out.println(m[a]);
        } catch (ArithmeticException e) {
            System.out.println("Произошла недопустимая арифметическая операция");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Обращение по недопустимому индексу массива");
        }
    }
}
提示されたプログラムを起動した後、ユーザーがキーボード 1 または 2 から入力すると、プログラムは例外を作成せずに実行されます。ユーザーが 0 を入力すると、クラスの例外が発生しArithmeticException、最初のブロックによって処理されますcatch。ユーザーが 3 を入力すると、クラス例外ArrayIndexOutOfBoundsException(配列の範囲外) が発生し、2 番目のブロックによって処理されますcatch。ユーザーが整数以外の数値 (たとえば、3.14) を入力すると、クラス例外が発生しInputMismatchException(入力タイプの不一致)、何も処理していないため、標準エラー形式でスローされます。ただし、クラス のハンドラを追加することはできますException。このクラスは他のすべてのチェック例外の親クラスであり、それらの例外 ( を含む) をすべてキャッチしますInputMismatchException
import java.util.Scanner;
class Main {
    public static void main(String[] args) {
        int[] m = {-1,0,1};
        int a = 1;
        Scanner sc = new Scanner(System.in);
        try {
            a = sc.nextInt();
            m[a-1] = 4/a;
            System.out.println(m[a]);
        } catch (ArithmeticException e) {
            System.out.println("Произошла недопустимая арифметическая операция");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Обращение по недопустимому индексу массива");
        } catch (Exception e) {
            System.out.println("Произошло ещё Howое-то исключение");
        }
    }
}
例外はクラスとサブクラスの階層に基づいて構築されるため、最初はより具体的な例外を処理し、その後でより一般的な例外を処理する必要があります。つまり、クラス例外処理を備えたブロックを (3 番目ではなく) 最初に配置した場合Exception、「他の例外が発生しました」以外のエラー メッセージは表示されません (すべての例外はこのブロックによって即座にキャッチされ、休む)。ブロックへのオプションの追加として、try…catchblock を使用できますfinally。そこに配置されたコマンドは、例外が発生するかどうかに関係なく、どのような場合でも実行されます。未処理の例外が発生した場合でも、この例外の生成後に残ったプログラムの部分は実行されません。たとえば、長時間の計算中に例外が発生した場合、finally中間結果をブロックに表示または保存できます。ソースへのリンク:例外とその処理
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION