3

Java のドキュメントによると、例外を「キャッチ」できるハンドラを指定するか、メソッド宣言で例外をスローすることが、チェックされた例外に必須であると記載されています。しかし、もしそうなら、例えば:

public class DivZero{
 public static void main(String[] args){
   int a=10;
   int[] b={1,2,3,4,0};
   for (int i=0;i<b.length;i++){
    System.out.println(a/b[i]);
   }
 }
}

「try-catch」または「throws」宣言がなくても問題なく動作します。java.lang.ArithmeticExceptionをスローします。じゃあ義務じゃないの?コンパイラは、適切な Java の「Throwable」クラスを同じ方法で暗黙的にスローします。それはそうです?

4

4 に答える 4

5

ArithmeticExceptionしたがって、これはRuntimeExceptionチェック例外ではありません。チェック例外は、 から継承されているが から継承されてExceptionいない例外RuntimeExceptionです。

JLS、11.1.1を引用します。例外の種類:

Throwable[...] チェックされた例外クラスは、それ以外のすべてのサブクラスRuntimeExceptionとそのサブクラス、およびエラーとそのサブクラスです。

于 2012-09-01T16:49:43.107 に答える
2

Javaには2種類の例外があります。例外を拡張するものはチェック済みと呼ばれ、処理(キャッチまたはスロー)する必要があります(たとえば、IOException ) 。RuntimeExceptionから拡張されたものは、チェックなしと呼ばれ、それらを使用して何かを行う必要がない限り、明示的に処理する必要はありません(たとえば、NullPointerException ) 。

問題のコードでは、ArithmeticExceptionがRuntimeExceptionから拡張されているため、チェックが外されており、明示的に処理する必要がないことがわかります。

于 2012-09-01T16:52:11.340 に答える
2

チェックされた例外のみをキャッチする必要があります: のjava.lang.Exceptionサブクラスではない のサブクラスjava.lang.RuntimeExceptionArithmeticExceptionのサブクラスですRuntimeException

RuntimeException(s) 通常、アプリケーションのバグを通知するため、例外をキャッチするのではなく、それらを解決する必要があります。int を 0 で除算しようとしているため、あなたの場合ArithmeticExceptionは行にスローさSystem.out.println(a/b[i]);れます。プログラムでそのような除算が発生しないようにする必要があります。

于 2012-09-01T16:50:40.890 に答える
1

ArithmeticException はチェック例外ではないため、問題なくコンパイルできます。Exception の子クラスはチェック済み例外と呼ばれ、残りはすべて未チェックです。

于 2012-09-01T16:50:45.947 に答える