1

メソッドa()とメソッドb()があり、どちらも例外をスローする可能性があるとします。私のプログラムでは、少なくとも1つを呼び出さなければならない状況があります。どちらを呼んでも構いません。ただし、一方が例外をスローした場合は、もう一方を呼び出す必要があります。両方が例外をスローした場合、私は何もする必要はありません。

私はこのようなことをすることを考えていました:

try {
    a();
catch (Exception e) {
    try {
        b();
    catch (Exception e) {

    }
}

しかし、呼び出すメソッドが3つ以上ある場合、これは実用的ではないと思いました。それで、私がやろうとしていることをするためのよりエレガントな、またはより良い方法があるかどうか疑問に思いました。

4

3 に答える 3

2

あなたはできる

    abc:
    {
        try
        {
            a();
            break abc;
        }
        catch(Exception e){}

        try
        {
            b();
            break abc;
        }
        catch(Exception e){}

        try
        {
            c();
            break abc;
        }
        catch(Exception e){}

    }

チェーンがさらに長い場合、おそらくより良い

for(int i=0; i<4; i++)
{
    try 
    {
        switch(i)
        {
            case 0: a(); break;
            case 1: b(); break;
            case 2: c(); break;
            case 3: d(); break;
        }
    }
    catch(Exception e){} // next
}
于 2012-10-28T23:15:24.010 に答える
2

最初の成功の後にリターンがヒットするように、各ケースの後にリターンできます。

public void uponSuccessStop() {
    try {
        a();
        return;
    } catch (Exception e) {}
    try {
        b();
        return;
    } catch (Exception e) {}
    try {
        c();
        return;
    } catch (Exception e) {}
}

別のオプションは、例外をスローし、短絡ブール論理を使用することです。

public boolean tryA() {
    try {
        a();
        return true;
    } catch (Exception e) {
        return false;
    }
}
// repeat for B and C

public void uponSuccessStop() {
    boolean succeeded = tryA() || tryB() || tryC();
}
于 2012-10-28T23:15:43.227 に答える
0

このような一般的なレベルで実用的なオプションについて議論することは困難ですが、次のようなことを行うことができます。

boolean succeeded = false;
try {
    a();
    succeeded = true;
} catch (Exception e) {
    // intentional ...
}
if (not succeeded) {
    try {
        b();
    catch (Exception e) {
        ...
    }
}

...および、ネストを回避するために条件 (またはbreakまたは) を使用するその他のあらゆる種類の配置。return

しかし、それらがより「エレガント」かどうか、またはより読みやすいかどうかは、コンテキストに大きく依存します。また、読み手に依存します。(経験豊富な Java プログラマーとして、ネストされた例外を理解するのに何の問題もありません。私の経験では、ネストを避けることを意図した人為的な構造は、コードを読みにくく、理解しにくくする可能性があります。)


あなたが本当にキャッチしないことを願っていますException... 'もしそうなら、それはtry / catchのネストよりもはるかに悪い問題です!!

于 2012-10-28T23:16:41.180 に答える