抛出声明和接口方法

时间:2010-05-28 18:38:04

标签: java interface exception refactoring

这是我正在处理的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();
}

由于不能通过第一种方法重新抛出异常,这将是一种重写这种方法的正确方法吗?

3 个答案:

答案 0 :(得分:3)

你的意思是第一个代码块在一个实现一个指定responseReceived没有throws子句的接口的类中,所以你不能重新抛出?

在这种情况下,您的类必须存储结果并提供API,客户端可以通过该API检索响应,即getResponseCode()方法。

查看java.util.concurrent类ExecutorServiceFuture

答案 1 :(得分:1)

如果您无法更改界面(或不想更改),则您的异常应为RuntimeException(或其中的某个自定义子类)。您可以将UnknownHostException中的RuntimeException包装为原因(使用带Throwable的构造函数)。

答案 2 :(得分:1)

如果你不能立即处理,就像在UI中显示一个明智的错误消息,通知最终用户必须采取另一种方法,或者在代码中采用替代路径,那么你需要在表示可恢复的开发人员错误时将其包装并重新抛出为RuntimeException,或在表示不可恢复的错误时将其Error包裹并重新抛出,例如IOError。无论哪种方式,都需要正确而清晰地记录下来。