1

multicatch (Java 7 以降) を使用してカスタム例外クラスを作成しています。これは私が作成したクラスです。次のコードを参照してください。

public class CustomException extends Exception{

public CustomException() {
    System.out.println("Default Constructor");
}
public CustomException(ArithmeticException e, int num){
    System.out.println("Divison by ZERO! is attempted!!! Not defined.");
}
public CustomException(ArrayIndexOutOfBoundsException e, int num){
    System.out.println("Array Overflow!!!");
}
public CustomException(Exception e, int num){
    System.out.println("Error");
}

上記のクラスは、次のクラスによって拡張されます。

import java.util.Scanner;

public class ImplementCustomException extends CustomException {

public static void main(String[] args) throws CustomException {
    int num = 0;
    System.out.println("Enter a number: ");
    try(Scanner in = new Scanner(System.in);){

        num = in.nextInt();
        int a = 35/num;

        int c[] = { 1 };
        c[42] = 99;
    }
    catch(ArithmeticException|ArrayIndexOutOfBoundsException e){

        throw new CustomException(e, num);
    }
}
}

これを実行しようとするたびに、「例外」を持つ同じコンストラクターが呼び出されます。なぜそれが起こっているのですか?

ただし、マルチキャッチ構文を次のコードに置き換えると。期待どおりに動作しています。

catch(ArithmeticException ex){
        CustomException e = new CustomException(ex, num);
        throw e;
}
catch(ArrayIndexOutOfBoundsException ex){
        CustomException e = new CustomException(ex, num);
        throw e;
}

マルチキャッチを使用して必要な例外をスローするために私ができる変更を手伝ってください。

4

2 に答える 2

4

ArithmeticExceptionandArrayIndexOutOfBoundsException以外に共通の親はありませんException。この1ブロックで

catch(ArithmeticException|ArrayIndexOutOfBoundsException e){
    throw new CustomException(e, num);
}

e静的型を取得します。これはExceptionRuntimeException. これで、CustomException(Exception e, int num)が呼び出されます。

分割するとe、より専用のタイプがあります。

于 2016-06-01T13:49:48.640 に答える
3

この動作は、JLS Sec 14.20で、あまり目立たない文で定義されています。

型が代替との共用体であることを示す例外パラメーターの宣言型D1 | D2 | ... | Dnは ですlub(D1, D2, ..., Dn)

lubJLS Sec 4.10.4で定義されている「最小上限」を意味します。

参照型のセットの最小上限、または「lub」は、他の共有スーパータイプよりも具体的な共有スーパータイプです(つまり、他の共有スーパータイプは最小上限のサブタイプではありません)。

あなたの場合、lubofArithmeticExceptionArrayIndexOutOfBoundsExceptionisRuntimeExceptionであるため、パラメーターの型として取るオーバーロードExceptionは、呼び出すことができる最も具体的なメソッドです。

呼び出されるオーバーロードを決定するのはコンパイラであることに注意してください。実行時に決定されるわけではありません。

于 2016-06-01T13:57:38.350 に答える