2010-03-23 237 views
5

我有以下3行的代碼:如果拋出IOException,我該怎麼辦?

ServerSocket listeningSocket = new ServerSocket(earPort); 
Socket serverSideSocket = listeningSocket.accept(); 
BufferedReader in = new BufferedReader(new InputStreamReader(serverSideSocket.getInputStream())); 

編譯器抱怨所有這些3條線,並且它的抱怨是所有3條線是相同的:未報告異常java.io.IOException的;更詳細地說,這些例外是由new ServerSocket,accept()getInputStream()引起的。我知道我需要使用try ... catch ...。但爲此,我需要知道這些例外在每個特定情況下的意義(我應該如何解釋它們)。什麼時候發生?我的意思是,不是一般的,而是在這三種特殊情況下。

回答

5

您不知道,特別是因爲IO異常也是一個「通用」異常,在技術上可能有許多原因。這意味着在輸入/輸出周圍發生意外問題,但顯然它在本地硬盤上的原因與在互聯網上的原因不同。

一般來說,所有三個項目都圍繞套接字進行解析。所以原因與網絡問題有關。可能是:

  • 根本沒有網絡,甚至沒有本地主機(將是一個嚴重的技術問題)。
  • 當端口號已被使用時(新服務器套接字(earPort))
  • 網絡問題 - 例如somseone在某些東西期間偶然發現電纜。也可能導致質量差,DDOS攻擊等。
  • 端口耗盡 - 沒有客戶端端口可用於新連接。

基本上圍繞這條線。

只要你真正對流進行了某些操作,就會發生或者能夠發生。

在THI scase你ahve兩種可能的主要原因:

  • 第一行:套接字已在使用中(計劃啓動2次,同一端口的其他程序)。除非用戶做了某些事情,否則這顯然是不可修復的。
  • 通用以後的運行時錯誤。這些可能在正常操作中發生。
+0

+1這是答案的核心。想想可能出現什麼問題。該API告訴你,它不會總是出於無法控制的原因。你想如何處理這種錯誤情況?一旦你知道這個問題的答案,你就會知道你想要做什麼來滿足編譯器。 – Yishai 2010-03-23 15:46:41

1

最簡單的方法就是聲明你調用方法拋出IOException,但是你離開你的方法之前,你需要在finally條款清理分配的資源:

public void doSession () throws IOException 
{ 
    final ServerSocket listeningSocket = new ServerSocket(earPort); 

    try 
    { 
    final Socket serverSideSocket = listeningSocket.accept(); 

    try 
    { 
     final BufferedReader in = 
     new BufferedReader(
      new InputStreamReader(
      serverSideSocket.getInputStream() 
     ) 
     ); 
    } 
    finally 
    { 
     serverSideSocket.close() 
    } 
    } 
    finally 
    { 
    listeningSocket.close() 
    } 
} 
1

一般來說它不完全沒關係什麼導致了最初的IOException,因爲您的應用程序可以做些什麼來糾正這種情況。

但是,作爲您「做什麼」問題的一般答案,您有幾個選項。

  • 再試一次 - 工作,如果問題是間歇性的。請記住提供一個休息條件,如果它沒有。
  • 嘗試別的東西 - 從不同位置或通過不同方法加載資源。
  • 放棄 - 投擲/重新拋出異常和/或放棄動作或者整個程序。您可能希望在這一點上提供用戶友好的消息... ;-)如果您的程序要求輸入功能,然後沒有輸入離開你幾乎沒有選擇,但不起作用
相關問題