2010-05-28 121 views
1

下面是我正在處理的一個FTP應用程序的一些代碼。第一種方法來自正在監視服務器輸出的類所觸發的接口。拋出聲明和接口方法

@Override 
public void responseReceived(FTPServerResponse event) { 
    if (event.getFtpResponseCode() == 227) { 
     try { 
      setupPassiveConnection(event.getFullResponseString()); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

它調用第二個setupPassiveConnection()引發一些異常。

public void setupPassiveConnection(String serverReplyString) throws UnknownHostException, IOException { 
    String passiveInfo[] = serverReplyString.substring(
      serverReplyString.indexOf("(") + 1, 
      serverReplyString.indexOf(")")).split(","); 

    int port = (Integer.parseInt(passiveInfo[4]) * 256) 
      + (Integer.parseInt(passiveInfo[5])); 

    String ip = passiveInfo[0] + "." + passiveInfo[1] + "." 
      + passiveInfo[2] + "." + passiveInfo[3]; 

    passiveModeSocket = new Socket(ip, port); 

    if(passiveModeSocket != null) 
     isPassiveMode(); 
} 

由於無法通過第一種方法重新拋出異常,那麼將重寫這種方法的正確方法是什麼?

+0

收到的回覆將被另一個類使用嗎?如果是的話,吉姆加里森的答案是正確的。 – 2010-05-28 18:50:23

回答

3

您的意思是第一個代碼塊是在一個實現了一個接口的類中,該接口指定了沒有throws子句的responseReceived,所以你不能重新拋出?

在這種情況下,您的課程必須存儲結果並提供一個API,通過該API客戶端可以檢索響應,即一個getResponseCode()方法。

查看java.util.concurrent類ExecutorServiceFuture

+0

是的。這是嘗試應用回調模式(請參閱http://stackoverflow.com/questions/2892743/handling-asynchronous-responses)。由於發送命令後無法立即回覆,因此我使用線程來檢測FTP服務器何時發送回覆。我會看看我能否找到一種實際的方法來存儲結果。 – 2010-05-28 23:56:26

1

如果您不能更改界面(或不想),您的例外應該是RuntimeException(或其中的一些自定義子類)。您可以將UnknownHostException作爲原因包裝在您的RuntimeException中(使用需要Throwable的構造函數)。

+0

感謝您的回覆。界面應該保持中立,以便您的解決方案看起來不錯。拋出'RuntimeException'應該在哪裏?在'setupPassiveConnection()'或者接口方法的Override中? – 2010-05-28 18:45:15

+0

@詹姆斯。無論你想拋出UnknownHostException,你都會拋出運行時異常。所以在這種情況下,它將來自setupPassiveConnection。你不必在responseReceived方法中捕獲它,如果你不這樣做,它會繼續拋出堆棧。 – 2010-05-28 19:34:00

1

如果你不能手柄他們馬上,像在UI顯示有意義的錯誤消息,通知最終用戶必須採取另一種方法,或採取替代路徑中的代碼,那麼你需要包裝和重新拋出如果它表示可恢復的開發人員錯誤,則表示爲RuntimeException;如果表示不可恢復的錯誤,則表示爲Error,例如IOError。無論哪種方式,都需要妥善清楚地記錄。

+0

感謝BalusC。這似乎遵循本主題中解釋的內容: http://forums.sun.com/thread.jspa?threadID=5375261 – 2010-05-29 00:13:22