2016-03-05 49 views
3
  • 如果我在一個元素的列表中進行搜索,並沒有發現它, 我拋出一個NotInListException
  • 否則,我想將它添加到另一個列表

我通過以其他方式使用try/catch,但以條件爲例外?

實現了這個
try { 

    element = actualList.find("foo"); 
    anotherList.append(element); 

} 
catch (NotInListException e) { 
} 

這種用法還行嗎?或者我應該與水木清華重構它是這樣的:

if ((element = actualList.find("foo")) != null) { 
    anotherList.append(element); 
} 
+5

我寧願'如果anotherList.append(元);' –

+0

謝謝,這看起來更「自然」。 – jam

+0

沒有實現List我知道有一個'find()'方法,什麼是'NotInListException'?這段代碼究竟是什麼? – Bohemian

回答

2

這是一個風格問題,如果你漠視異常處理程序給出的小運行處罰。

人們可以設計一個堆棧型像

try{ 
while(true){ 
    try{ 
     stack.pop(); 
    catch(StackElement e){ 
     processElement(e); 
    } 
} 
catch(EmptyStackException ese){ 
    // probably not much to do here. 
} 

共識是,爲便於閱讀和常識的原因,通常if條件使事情變得更容易理解。異常機制應該用於特殊情況,而不是常規流量控制。

在你的find的例子中,你有兩種情況,它們都不是不尋常的。所以一個例外可能是不必要的。

1 - 沒有找到元素。

2 - 找到元素。

情況2需要額外關注,因爲您的find版本也希望返回實際元素。

1 || 2是布爾情況。所以這不應該是一個元素。 case 2的find()應該是一個元素。

我一直不喜歡非值的返回null。它使醜陋的代碼。請回想一下

void f(BufferedReader br){ 
    String line; 
    while((line = br.readLine()) != null) 

更好的做法是將布爾值與元素分開。

if(list.has(foo)){ 
    E element = list.get(foo); 
} 
-1

我建議寫這樣的事情:

List<String> elements; //get the list 
try{ 
    if(elements.contains("foo")){ 
     anotherList.add("foo"); 
    }else{ 
     throw new NotInListException("Element not present"); 
    } 
}catch(NotInListException ex){ 
    //do something 
} 
0

我相信你的代碼應該遵循邏輯主體。如果問題是拋出還是不拋出NotInListException,那麼需要回答的問題是:元素不在列表中是否是異常情況?我們是否真的期望該元素在列表中?如果答案是肯定的,那麼當元素不在列表中的情況是例外的,因此拋出異常是有意義的。否則它應該是一個if-else邏輯。

1

你的第二個例子更清晰,更易於閱讀。您沒有提供任何詳細信息,但我認爲在您的搜索中找不到價值不應視爲特殊情況。

使用Java 8,你甚至可以考慮返回一個Optional並添加結果是這樣的:(!actualList.contains(元素))

actualList 
    .find("foo") 
    .ifPresent(v -> anotherList.add(v)); 
相關問題