2014-02-16 76 views
1

使用Java 1.7,下面的代碼未捕獲java.nio.channels.UnresolvedAddressException

try 
{ 
    sck = SocketChannel.open(); 
    sck.configureBlocking(false); 

    sck.connect(new java.net.InetSocketAddress(**<bad remote ip address>**, remote_port)); 
    sel = Selector.open(); 

    ... 
} 
catch (IOException e) 
{ 
    return false; 
} 

似乎沒有捕獲異常如果遠程地址是一個壞的DNS(例如)。我錯過了什麼?

回答

5

UnresolvedAddressExceptionIOException一個子類,這就是爲什麼你會不會抓住它,如果它拋出。

UnresolvedAddressExceptionIllegalArgumentException一個子類,如圖所示here,所以儘量捕捉:

  • UnresolvedAddressException本身,因爲它總是更好的做法,以捕捉最具體的異常類型第一
  • Exception如果你不這樣做真的關心你所遇到的異常,因爲你總是可以暫停程序或解決該問題

編輯:您可能錯過了該異常,因爲編譯器不會強制您捕捉它。這是因爲UnresolvedAddressException是從RuntimeException派生而來的,這是在執行期間令你頭腦發熱的例外類型。例外而不是派生自RuntimeException,如IOException,必須被捕獲,這就是爲什麼你的編譯器可能告訴你首先將你的代碼包裝到try-catch塊中的原因。

1

UnresolvedAddressException不是IOException的子項。 UnresolvedAddressException擴展了RuntimeException。 您可以嘗試使用RuntimeException添加catch閉包。