English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Javaで、プログラマーはどのようにして例外を手動でスローするのでしょうか?

プログラムの実行中に発生する問題(ランタイムエラー)は例外です。例外が発生すると、プログラムは突然終了し、例外が発生した行の後のコードは決して実行されません。

示例

import java.util.Scanner;
public class ExceptionExample {
   public static void main(String args[]) {
      Scanner sc = new Scanner(System.in);
      System.out.println("1番目の数を入力してください: ");
      int a = sc.nextInt();
      System.out.println("2番目の数を入力してください: ");
      int b = sc.nextInt();
      int c = a/b;
      System.out.println("結果は: " );+c);
   }
}

出力結果

1番目の数を入力してください:
100
2番目の数を入力してください:
0
thread "main"での例外 java.lang.ArithmeticException: / by zero
at ExceptionExample.main(ExceptionExample.java:10)

例外を手動で投げます

次のように使用できますthrow キーワードで明示的にユーザー定義の例外またはプレ定義の例外を投げます。

ユーザー定義およびプレ定義の例外は2種類あり、それぞれの例外はThrowableクラスを表すクラスで表されます。

明示的に例外を投げるには、そのクラスをインスタンス化してthrowキーワードを使用してそのオブジェクトを投げる必要があります。

示例

以下のJavaプログラムはNullPointerExceptionを引き起こします。

public class ExceptionExample {
   public static void main(String[] args) {
      System.out.println("Hello");
      NullPointerException nullPointer = new NullPointerException();
      nullPointerをthrowします。
   }
}

出力結果

Hello
thread "main"での例外 java.lang.NullPointerException
   at MyPackage.ExceptionExample.main(ExceptionExample.java:6)

明示的に例外を投げるときは、throwキーワードのある行がプログラムの最後の行であることを確認する必要があります。なぜなら、その後書かれたコードはアクセス不能であり、その行の下にコードがあればコンパイルエラーが生成されます。

示例

public class ExceptionExample {
   public static void main(String[] args) {
      System.out.println("Hello");
      NullPointerException nullPointer = new NullPointerException();
      nullPointerをthrowします。
      System.out.println("How are you");
   }
}

编译时错误

D:\>javac ExceptionExample.java
ExceptionExample.java:6: error: unreachable statement
   System.out.println("How are you");
   ^
1 error

用户定义的例外

通常throw关键字通常用于引发用户定义的异常。每当我们需要定义自己的异常时,就需要定义扩展Throwable类的类,并覆盖所需的方法。

实例化此类,并在需要异常的任何地方使用throw关键字将其抛出。

示例

在下面的Java程序中,我们将创建一个名为AgeDoesnotMatchException的自定义异常类。

public class AgeDoesnotMatchException extends Exception{
   AgeDoesnotMatchException(String msg){
      super(msg);
   }
}

另一个类Student包含两个私有变量名称age和一个初始化实例变量的参数化构造函数。

作为主要方法,我们接受用户的姓名和年龄值,并通过传递接受的值来初始化Student类。

在Student类的构造函数中,我们创建了一个异常AgeDoesnotMatchException的对象,并在年龄值介于17まで24之间时引发了异常(使用throws)。

public class Student extends RuntimeException {
   private String name;
   private int age;
   public Student(String name, int age){
      try {
         if (age<17||age>24) {
            String msg = "Age is not between 17 および 24";
            AgeDoesnotMatchException ex = new AgeDoesnotMatchException(msg);
            throw ex;
         }
      }catch(AgeDoesnotMatchException e) {
         e.printStackTrace();
      }
      this.name = name;
      this.age = age;
   }
   public void display(){
      System.out.println("Studentの名前: "+this.name );
      System.out.println("Studentの年齢: "+this.age );
   }
   public static void main(String args[]) {
      Scanner sc= new Scanner(System.in);
      System.out.println("Studentの名前を入力してください:");
      String name = sc.next();
      System.out.println("Studentの年齢を入力してください"); 17 まで 24 (含む 17 および 24);
      int age = sc.nextInt();
      Student obj = new Student(name, age);
      obj.display();
   }
}

出力結果

このプログラムを実行する際には、キーボードから名前と年齢の値を入力する必要があります。入力された年齢が以下の範囲内でない場合17まで24の範囲内でない場合、例外が発生します。以下のようになります-

Studentの名前を入力してください:
Krishna
Studentの年齢を入力してください 17 まで 24 (含む 17 および 24)
14
AgeDoesnotMatchException: 年齢は以下の範囲でない場合に発生します 17 および 24
Studentの名前: Krishna'
Studentの年齢 14
   at Student.<init>(Student.java:18)
   at Student.main(Student.java:39)
おすすめ