1

假设您必须使用软件供应商提供的 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);
}

如何修复错误?

4

4 回答 4

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();
  }
}
于 2012-07-03T02:49:54.253 回答
0

您基本上有两个不错的选择:

选择1:
如果你能合理处理异常,那么就这样做:

try {
    String res = conn.getData(command);
} catch (IOException e) {
    // do something sensible, perhaps return null or a default value etc
}

如果有意义,这通常是一个不错的选择,因为它不会给调用者带来任何处理异常的负担


选择 2:
如果您无法合理处理异常,请让您的方法抛出异常。这里的设计问题是你抛出什么异常?

如果异常“非常适合”您的代码的其余部分,只需声明您的方法以抛出来自 3rd 方库的预期异常:

public void processData(Connection conn, String command) throws IOException

但是,通常在调用 3rd 方库时,它抛出的异常与您的应用程序不兼容。在您的情况下,IOException可能完全在您的应用程序的域之外,仅因为第 3 方的实现访问远程服务器(例如)而抛出,并且抛出IOException会在您的代码中引入一个新异常,该异常与它的目的(例如,您的应用程序可能与使用远程服务器无关)。

在这些情况下,最好将异常包装在域异常中并抛出它。例如:

public void processData(Connection conn, String command) throws ProcessingException
    try {
        String res = conn.getData(command);
    } catch (IOException e) {
        throw new ProcessingException(e);
    }
}

为此,您将创建这样一个异常类:

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所有其他常见的未经检查的异常并列,我们也没有捕捉到这些异常。

于 2012-07-03T03:29:48.307 回答
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
于 2012-07-03T02:51:17.287 回答
0

☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠</h1>

不要做它的反模式!

☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠</h1>
try {
    String res = conn.getData(command);
    System.out.println(res);
} catch (IOException e) {
    throw new RuntimeException(e);
}

于 2012-07-03T03:03:08.803 回答