web-dev-qa-db-ja.com

Javaで例外をスローせずにtry / catchブロックから抜け出す方法

例外をスローせずにtry/catchブロックの途中から抜け出す方法が必要です。 forループのbreak and continueに似た何か。これは可能ですか?

私は単純なキャッチハンドラーで何もしないカスタム例外( "BreakContinueException"という名前)をスローすることについて奇妙な考えを持っています。これは非常にねじれていると確信しています。

だから、私が知らない単純な解決策はありますか?

51
Basil Musa

適切な方法は、おそらくtry-catchブロックを別のメソッドに入れてメソッドを分解し、returnステートメントを使用することです。

public void someMethod() {
    try {
        ...
        if (condition)
            return;
        ...
    } catch (SomeException e) {
        ...
    }
}

コードに多くのローカル変数が含まれる場合、 Stephen C で示唆されているように、ラベル付きブロックからbreakを使用することも検討できます。

label: try {
    ...
    if (condition)
        break label;
    ...
} catch (SomeException e) {
    ...
}
46
aioobe

ループ構成からのbreakまたはaioobiesの回答で指定されているラベル付きbreakを使用して、いつでも実行できます。

public static void main(String[] args) {
    do {
        try {
            // code..
            if (condition)
                break;
            // more code...
        } catch (Exception e) {

        }
    } while (false);
}
27
dacwe

さまざまな方法:

  • return
  • breakまたはループ内のcontinue
  • ラベル付きステートメントのときにラベルを付けるbreak(@aioobeの例を参照)
  • break switchステートメントの場合。

...

  • System.exit() ...それはおそらくあなたが言っていることではないでしょう。

私の意見では、「just try/catchから抜け出したい」場合、これを行う最も自然な(最もゆがんだ)方法は "label to break"です。しかし、初心者Javaに遭遇したことのないプログラマーJava構文。

しかし、ラベルはあいまいですが、私の意見では、breakを使用できるようにコードをdo ... while (false)でラップするのは悪い考えです。これは、初心者と初心者を混同します。初心者(および初心者でもない!)にとっては、ラベル付きステートメントについて学ぶ方が良いでしょう。


ところで、returnから抜け出す必要がある場合は、finallyが機能します。ただし、returnブロックでfinallyを実行することは避けてください。セマンティクスが少し混乱し、読者に頭痛の種を与えやすいためです。

13
Stephen C

いくつかの方法があります:

  1. コードを新しいメソッドに移動し、そこからreturn

  2. Try/catchをdo{}while(false);ループでラップします。

7
Aaron Digulla

Catchブロックのこのサンプルでは、​​counterの値を変更し、ブロック中にブレークします:

class TestBreak {
    public static void main(String[] a) {
        int counter = 0;

        while(counter<5) {
            try {
                counter++;
                int x = counter/0;
            }
            catch(Exception e) {
                counter = 1000;    
            }
        }
    }
}k
2
Fariba

これは私が通常行うコードです:

 try
 {
    ...........
    throw null;//this line just works like a 'break'
    ...........   
  }
  catch (NullReferenceException)
  { 
  }
  catch (System.Exception ex)
  {
      .........
  }
1
Gisway

returnがなければfinallyはどうでしょう

1
Jigar Joshi