2016-04-14 114 views
0

我有兩個不同的類共享一個共同類型的屬性(IpAddress,其中也包含有關該子網的所有信息)。現在,IpAddress是一個用戶定義類型,我有一個函數setSecondaryRouter(),它可以改變這種類型的屬性。爲了讓程序按預期運行,我需要一個不變量(或者2個不變量)。這在功能setSecondaryRouter()中檢查。但是,我想將此屬性secondaryRouter設置爲與第一個對象相同。這種暗示不變已經在我第二次使用setSecondaryRouter()。由於這個原因,我知道這個函數不會拋出。我可以防止java拋出某些異常嗎?

問題是我的編譯器「幫助」確保沒有未編譯的未捕獲的異常,除非添加try-catch子句或添加一個throws聲明調用者函數(從而幫助解決一個不存在的問題)。我想要做的是告訴Java,這個異常不會被拋出。將此與C++中的nothrow關鍵字進行比較。我知道類似的問題都已經發布,像下面

Is there any standard annotation to indicate nothrow semantics in Java?

但我的問題的不同點在於,我不希望添加一拋,或嘗試-catch子句,而我知道會不會被拋出特定的異常!

另外一個表達式是IllegalArgumentException。這個例外可以成爲我必須處理例外的原因嗎?

+1

使它們檢查異常。然後,它沒有被方法拋出的事實意味着它不會被方法拋出。 –

+0

@AndyTurner所以即使我知道運行時異常將不得不處理它? – patrik

+0

沒有。您不必處理未檢查的異常;你不能保證他們不會被拋出。 –

回答

2

必須區分checked and unchecked exceptions之間繪製來回答這個問題:

  • 如果方法不聲明它拋出檢查異常,不能拋出類型的異常(或之一其亞型):

    void doSomething() { 
        throw new Exception(); // Illegal, without throws Exception on doSomething(); 
    } 
    

    這樣,你知道,檢查異常不是由一個方法拋出如果沒有宣佈它扔那EXCE ption。

    檢查異常意圖被捕獲,因爲它們是假定指示您可以恢復的條件,因此您需要知道它們發生了。例如IOException:如果稍後再試,文件可能存在,磁盤上可能有空間,網絡可能會備份(等)。

  • 一個方法可以拋出一個未經檢查的異常而不會聲明它的確如此;但同樣,如果你不想要(例如因爲你知道它不可能被拋出),你不需要做任何工作來捕捉它。因此,永遠不能保證某個特定的RuntimeException不是通過某種方法拋出 - 也許它不是通過您調用的方法直接拋出,而是可能由調用的方法拋出(現在或將來的實現) 。

    未經檢查的異常並非真正意圖被捕獲,因爲它們是假定爲以指示不可恢復的錯誤,如編程錯誤。例如NullPointerException:您可以使用相同的參數調用相同的方法,但它仍然會失敗,因爲您運行的是相同的代碼。

+0

啊,好吧,我看,它是另一個檢查異常(未提及,稱爲「InternalException」,它意味着什麼是無關的),這會導致麻煩。所以你的意思是說,沒有辦法告訴java來__not處理一個檢查的異常,因爲我知道這是之前處理的?回答,我會接受(這意味着我將支付我不使用的東西......)。 – patrik

+0

這是正確的。你總是必須通過捕獲或傳播檢查異常。 –

1

java.lang.IllegalArgumentException是運行時異常,所以編譯器不考慮它。

如果第一次使用setSecondaryRouter()時可能引發異常,則必須聲明它。

也許你可以聲明一個新方法cloneFirstRouterToSecondRouter,像下面這樣,捕捉你的異常。

public void cloneFirstRouterToSecondRouter(){ 
     try{ 
     setSecondaryRouter(); 
     catch(Exception e){ 
     // should never occur 
     } 
    } 
+0

請注意,對於「永遠不應該發生」的情況,代碼路徑應該始終做某些事情,以防萬一。 '拋出新的AssertionError(e);',所以你知道[他們在實踐中怎麼「永遠不會發生」)(https://en.wikipedia.org/wiki/Murphy%27s_law)。 –

+0

:(好吧,我看,這很煩人,我猜在Java中不存在「這是你自己的錯誤」,即使我們知道「錯誤的事情永遠不會發生」,大哥哥oracle會強制我們做正確的事情,從而強制執行處罰。無論如何感謝您的建議 – patrik