0

x が 5 に等しいときに例外をスローするメソッドを作成しようとしていますf1(x)。その後、別のメソッドからそのメソッドf2()を呼び出して、その例外を呼び出そうとします。f2()次に、 を呼び出して回復する必要がありf1(x+1)ます。何かをコーディングしようとしましたが、行き詰まっています。コードは次のとおりです。

public class FiveException extends Exception {

public void f1(int x) throws FiveException {
    if (x == 5) {
        throw new FiveException();
    }
}

public void f2() {
    int x = 5;
    try {
        f1(x);
    }catch (FiveException e) {
        System.out.println("x is 5");
    }

}


public static void main(String[] args) {
    FiveException x5 = new FiveException();
    x5.f2();
}

}

print ステートメントは機能しますが、 を呼び出す方法がわかりませんf(x+1)。これを修正する方法と、例外を作成するためのテクニックについてのヘルプをいただければ幸いです。

4

1 に答える 1

1

f1throwsのためFiveException、どこを呼び出しf1ても、例外をキャッチするか、例外を発生させたメソッドを呼び出しているメソッドにスローする必要があります。例えば:

public static void main(String[] args) throws FiveException {
    FiveException x5 = new FiveException();
    x5.f1(1);
}

または:

public static void main(String[] args) {
    FiveException x5 = new FiveException();

    try {
        x5.f1(1);
    } catch (FiveException e) {
        e.printStackTrace();
    }
}

しかし、あなたのコードは紛らわしいです...通常、それ自体をスローするのは例外クラスではなく、例外クラスをスローする他のクラスがあります。

これが catch ステートメント内で呼び出されている場合は、別の で囲む必要があります。これは、次try-catchのように、内部のコードcatchが保護されていないためです。

public void f2() {
    int x = 5;
    try {
        f1(x);
    }catch (FiveException e) {
       System.out.println("x is 5");
       try {
           f1(x + 1);
       } catch (FiveException e) {
           e.printStackTrace();
       }
    }
}

しかし、このコードは醜いので、次のように書くことができます:

public void f2() {
    int x = 5;
    fProtected(x);
    fProtected(x + 1);
}

private void fProtected(int x) {
    try {
        f1(x);
    }catch (FiveException e) {
       System.out.println("x is 5");
    }
}
于 2013-05-14T23:57:06.263 に答える