这是我正在处理的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 :(得分:3)
你的意思是第一个代码块在一个实现一个指定responseReceived
没有throws子句的接口的类中,所以你不能重新抛出?
在这种情况下,您的类必须存储结果并提供API,客户端可以通过该API检索响应,即getResponseCode()
方法。
查看java.util.concurrent类ExecutorService
和Future
。
答案 1 :(得分:1)
如果您无法更改界面(或不想更改),则您的异常应为RuntimeException
(或其中的某个自定义子类)。您可以将UnknownHostException
中的RuntimeException
包装为原因(使用带Throwable
的构造函数)。
答案 2 :(得分:1)
如果你不能立即处理,就像在UI中显示一个明智的错误消息,通知最终用户必须采取另一种方法,或者在代码中采用替代路径,那么你需要在表示可恢复的开发人员错误时将其包装并重新抛出为RuntimeException
,或在表示不可恢复的错误时将其Error
包裹并重新抛出,例如IOError
。无论哪种方式,都需要正确而清晰地记录下来。