web-dev-qa-db-ja.com

Java try and catchブロックで例外がスローされない場合にのみコードを実行しますか?

例外がスローされなかった場合にのみコードが実行されるようにするにはどうすればよいですか?

最後に、例外があったかどうかに関係なくコードが実行されます。

try {
   //do something
} catch (Exception e) {}
//do something only if nothing was thrown
20
Muhammad Umer

次の2つの方法があります。

try {
    somethingThatMayThrowAnException();
    somethingElseAfterwards();
} catch (...) {
    ...
}

または、コードの2番目のブロックをtryブロックの外側にする場合:

boolean success = false;
try {
    somethingThatMayThrowAnException();
    success = true;
} catch (...) {
    ...
}
if (success) {
    somethingElseAfterwards();
}

ifステートメントをfinallyブロックに入れることもできますが、それが望ましいかどうかを判断するのに十分な情報が質問にありません。

45
khelwood
_try {
    doSomething();
    doSomething2();
} catch (Exception e) {
    doSomething3();
}
_

この例では、doSomething2()によって例外がスローされない場合にのみ、doSomething()が実行されます。

doSomething()によって例外がスローされた場合、doSomething2();はスキップされ、実行はdoSomething3();にジャンプします

また、doSomething3()によってスローされた例外がある場合、doSomething2();が実行されることに注意してください。

例外がスローされない場合、doSomething3();は実行されません。

18
ThePerson

コードをtryブロックに入れるだけです。例外がスローされると、catchブロックにスキップします。例外がスローされない場合、コードは実行されます。

try {
    someMethodThatMayThrowException();
    codeThatShouldBeRunIfNoExceptionThrown();
} catch (Exception e) {...}
3
pathfinderelite

提案の強化

try {
    somethingThatMayThrowAnException();
    somethingElseAfterwards();
} catch (...) {
    ...
}

受け入れられた答えから。あなたがすべきことは:

void foo() {
  try {
    doStuff();
  } catch (...) {
    handleException();
  }
}

上記は、「クリーンなコード思考」にさらされていない人にとってはやり過ぎのように感じます。

しかし、ここでのポイント:あなたはnot 1つのメソッド内に異なる抽象化を混在させたいと思っています。つまり、1つのtryブロックがなく、同じメソッド内でその後ろに続くコードが増えます。

各メソッドに単純なパスが含まれていることを確認してください-読み取りフローを複雑にするものは避けてください。 such種類のコードの書き込みと読み取りに慣れるとすぐに、コードを理解する時間が劇的に短くなることがわかります。

2
GhostCat

フロー制御の例外は、一種の悪い習慣です。主張する場合は、boolean変数を使用します。

boolean thrown = false;

try {
   //do something
} catch (Exception e) {
   thrown = true;
}

//do something only if nothing was thrown

if (!thrown) { 
    // do stuff
}
1
Adrian