2014-11-06 35 views
1

在下面的代碼中,如果在字符串列表中找不到元素,則會拋出異常。拋出異常以指示找不到元素

import java.util.ArrayList; 
import java.util.List; 

public class TestException { 

    private static List<String> strList = new ArrayList<String>(); 

    static { 
     strList.add("1"); 
     strList.add("2"); 
    } 
    public static void main(String argsp[]) { 

     try { 
      String res = new TestException().findId("1"); 
      System.out.println(res); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     try { 
      String res = new TestException().findId("11"); 
      System.out.println(res); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

    private String findId(String id) throws Exception { 

     for(String str : strList){ 
      if(id.equalsIgnoreCase(str)){ 
       return str; 
      } 
     } 

     throw new Exception("Exception Thrown - element not found"); 

    } 

} 

運行時輸出爲:

1 
java.lang.Exception: Exception Thrown - element not found 
    at com.fmr.fc.portlet.actionabledashboard.throttling.TestException.findId(TestException.java:40) 
    at com.fmr.fc.portlet.actionabledashboard.throttling.TestException.main(TestException.java:24) 

爲了保持代碼量低的問問題,我拋出異常,但我會拋出一個自定義異常。 我拋出一個異常的原因是自定義異常被進一步調用堆棧來指示錯誤。

但是,這是不好的做法拋出這種異常 - findId是拋出一個異常,如果沒有找到一個ID?

+1

該物品是否應該在列表中(在這種情況下,如果不是這種情況,則爲錯誤)或該物品不在列表中是否正常? – immibis 2014-11-06 10:56:58

+0

@immibis該項目在列表中的正常狀態 – 2014-11-06 11:00:26

+0

,但是該項目不在列表中也是正常的嗎? – immibis 2014-11-06 11:00:51

回答

0

是的,這是不好的做法。您應該編寫一個傳遞布爾值的函數,並允許程序使用它來確定要執行的操作。

異常應該只用於處理非常罕見的,完全不可避免的事件。它們不應該成爲你的代碼的標準邏輯的一部分,它們是(意外的)規則的例外。可能(可能)發生的事情,但不太可能發生,你真的,真的找不到阻止它們的方法。

+1

「例外應該只用於處理非常罕見的,完全不可避免的事件。」我不同意,每當你不知道如何糾正失敗時,都必須執行例外。 – Julien 2016-04-27 07:15:30

+1

我同意失敗是異常用例的子集,但不是唯一的子集。另一種用法可能像InterruptedException,在技術上什麼都沒有失敗,但是程序流程中的突然變化需要被髮送回堆棧。 我認爲在問題的背景下,定義是有幫助的,但你說得對,它在更大的意義上太模糊了...... – FelixMarcus 2016-04-30 12:19:22

0

一般來說,在這種情況下引發異常是一種不好的做法。嘗試修改您的函數以返回Guava模式中使用的Optional。一些細節here

相關問題