2016-04-28 34 views
0

try catch塊請求要經過的步驟的Java嘗試三種方法並只,如果沒有成功

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

catch塊如果我有計劃A,B計劃和C計劃,我想嘗試在每個計劃一排

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") }; 

這是更好的/不好的風格問題。 「嘗試執行至少一個命令或拋出異常」是一種普遍現象(try/catch塊)。嵌套的「keep.trying」很少使用。這是因爲有更好的風格嗎?或者因爲一個程序不應該產生太多的噪音(以很小的成功率打電話)?

+1

您對實際問題的描述過於模糊,無法給出具體的建議。但是,如果您想要的是對您所擁有的解決方案的更通用的解決方案,則只需一個操作成功即可停止的循環。 –

+0

這聽起來有點像你試圖用異常來表示失敗方法的失敗。如果是這樣,那就是糟糕的風格。更好的風格是讓他們返回一個成功/失敗的標誌,甚至是一個布爾值,這將使得它非常容易鏈接。 – CPerkins

回答

3

你可以寫做的方法正確的方法是帶着幾分LAMDA用法。

@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而不是拋出異常。 if(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*/...

相關問題