假设您必须使用软件供应商提供的Connection类中的方法。文档指出了以下方法声明:
public String getData(String command) throws IOException
以下代码尝试使用getData方法以String格式获取数据并将数据输出到输出控制台。但IDE指示代码具有异常处理相关错误。
public void processData(Connection conn, String command) {
String res = conn.getData(command);
System.out.println(res);
}
如何修复错误?
答案 0 :(得分:1)
简单的方法是简单告诉Java这段代码可以抛出异常:
public void processData(Connection conn, String command) throws IOException {
String res = conn.getData(command);
System.out.println(res);
}
但你也可以自己捕捉异常:
public void processData(Connection conn, String command) {
try {
String res = conn.getData(command);
System.out.println(res);
} catch(IOException e) {
e.printStackTrace();
}
}
答案 1 :(得分:0)
捕获异常(如果您知道如何正确处理异常):
try {
String res = conn.getData(command);
System.out.println(res);
} catch (IOException e) {
// handle it
}
或者,对此方法进行例外规范:
public void processData(Connection conn, String command) throws IOException
答案 2 :(得分:0)
try {
String res = conn.getData(command);
System.out.println(res);
} catch (IOException e) {
throw new RuntimeException(e);
}
答案 3 :(得分:0)
你基本上有两个不错的选择:
选择1:
如果您可以合理地处理异常,那么这样做:
try {
String res = conn.getData(command);
} catch (IOException e) {
// do something sensible, perhaps return null or a default value etc
}
这通常是一个很好的选择,如果它有意义,因为它不会给调用者带来任何负担来处理异常
选择2:
如果您无法合理地处理异常,请让您的方法抛出异常。这里的设计问题是你会抛出什么异常?
如果异常“适合”代码的其余部分,只需声明您的方法抛出第三方库预期的异常:
public void processData(Connection conn, String command) throws IOException
但是,通常在调用第三方库时,它抛出的异常与您的应用程序不兼容。在您的情况下,IOException
可能完全在您的应用程序的域之外,仅因为第三方的实现访问远程服务器(例如)而抛出,并且抛出IOException
会引入新的异常不符合其目的的代码(例如,您的应用程序可能与使用远程服务器无关)。
在这些情况下,最好在域异常中包装异常并抛出异常。例如:
public void processData(Connection conn, String command) throws ProcessingException
try {
String res = conn.getData(command);
} catch (IOException e) {
throw new ProcessingException(e);
}
}
要实现这一点,您需要创建一个Exception类:
public class ProcessingException extends Exception {}
现在你有了进一步的选择。如果预计不会发生异常,换句话说,您已采取合理的步骤来确保它没有(通过确保环境正确等),您可以选择抛出未经检查的异常:
public void processData(Connection conn, String command)
try {
String res = conn.getData(command);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
这个版本基本上是说预期不会出现异常,我们不会为它编码,因为情况在任何级别都无法恢复,所以只是让它爆炸,它会冒出来的呼叫堆叠,直到有东西捕获Exception
。
这不是一种“反模式”,因为它与NullPointerException
以及所有其他常见的未经检查的异常并列,并且我们也没有捕获它们。