2010-05-28 100 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