2016-04-28 4 views
0

するTry catchブロックは、私はプランA、プランBと計画Cを持っていると私は各プランを試してみたい場合はどのような手順Javaはどれも

try { 
    step a; 
    step b; 
    step c; 
} catch { 
    System.out.print("one of the steps failed"); 
} 

を通過するように求め成功しない場合にのみ、3つのメソッドを試してみて、catchブロックを入力してください行

keep.trying{ 
    plan A; 
    plan B; 
    plan C; 
} catch { 
    System.out.print("None of the plans worked"); 
} 

一方が行うことができ

boolean done=false; 
try { 
    planA(); 
    done=true; 
}catch{// :|} 

if (done!=true){ 
    try { 
     planB(); 
     done=true; 
    }catch{// :(} 

if (done!=true){ 
    try{ 
     planC(); 
    }catch{ System.out.print("Failed"); } 

if (done == true){ System.out.print("Success") }; 

これはもっと良い/悪いスタイルの質問です。 "少なくとも1つのコマンドを実行しようとするか、例外をスローする"のが一般的です(try/catchブロック)。ネストされた "keep.trying"はほとんど使用されません。これはより良いスタイルがあるためですか?または、プログラムがあまりにも多くのノイズを発生させるべきではない(小さな成功率でコールを行う)か?

+1

実際の問題の説明は、あまりにも曖昧すぎて具体的なアドバイスを行っていません。しかし、あなたが望むものが、あなたが持っているものに対するより汎用的な解決策であれば、必要なのは、1つの操作が成功するとすぐに停止するループだけです。 –

+0

これは、例外を使用してvoidメソッドからの失敗を通知しようとしているように、ちょっと匂いがします。もしそうなら、それは悪いスタイルです。より良いスタイルは、成功/失敗フラグを返すようにすることです。ブール値であっても、チェーン化が非常に簡単です。 – CPerkins

答えて

3

あなたはラムダの使用のビットでそれを行う方法を書くことができを行うための適切な方法だと思います。

@FunctionalInterface 
public interface Plan { 
    public void execute() throws Exception; 
} 

public static boolean tryAll(List<Plan> lst) { 
    for(Plan p : lst) { 
     try { 
      p.execute(); 
      return true; //If we reach this line, p succeeded 
     } catch (Exception e) { 
      //This plan failed 
     } 
    } 
    return false; //All plans failed 
} 

代わり:コードのここ

@FunctionalInterface 
public interface Plan { 
    public boolean execute(); 
} 

public static boolean tryAll(List<Plan> lst) { 
    for(Plan p : lst) { 
     if(p.execute()) return true; 
    } 
    return false; //All plans failed 
} 
+1

OPのように思えますが、例外をスローするのではなく、true/falseを返す関数があります。もし(p.execute){return true;)}していなければ、最後にfalseを返します。 –

+1

それも当てはまります。元のコードからは、 "プラン"が例外をスローするように思えましたが、代わりに戻り値を使用するように簡単に修正することができました。 – Mshnik

0
try{ 
    planA; 
} 
catch 
{ 
    try 
    { 
     planB; 
    } 
    catch 
    { 
     try 
     { 
      planC 
     } 
    } 
} 

私がこの

+0

私はこれが非常に悪いスタイルだと思う。 – loonytune

+0

@ loonytune私の質問は、それを悪いスタイルといいスタイルにするものです。また、警告は何ですか? – Stepan

2

可読性が鍵となります。これは一般的なパターンではありません。それは普通のコードでもありません。

この状況はまれです。ですから、簡潔にするのではなく、コードを明確にすることが重要です。だから、複数の文字を書きますcatch{try{/*do something*/}{catch{try{/*do something else*/...