异常处理错误:使用Java?

时间:2012-07-03 02:47:04

标签: java exception-handling

假设您必须使用软件供应商提供的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 个答案:

答案 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以及所有其他常见的未经检查的异常并列,并且我们也没有捕获它们。