糟糕的尝试抓住块设计?

时间:2016-07-20 06:23:52

标签: java exception-handling try-catch

每当我在代码中使用try-catch块时,我的代码总是遵循一个模式。 首先是一个try-catch块来打开一个资源,然后是一个空检查,最后是一个try-catch块来读取资源。 这是一个混乱的模式吗?如果是这样,好的设计应该是什么样的?

这是我的意思的一个例子

public static void main(String[] args) {
    Process process = null;
    try {
        process = Runtime.getRuntime().exec("C:\\program.exe");
    } catch (IOException e) {
        e.printStackTrace();
    }
    if (process == null) {
        return;
    }
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

1 个答案:

答案 0 :(得分:4)

您的问题是您正在抑制代码中的异常,这就是您需要进行空检查的原因。特别是因为这是一个main()方法,你可以让异常传播:

public static void main(String[] args) throws IOException {
  Process process = Runtime.getRuntime().exec("C:\\program.exe");
  try (BufferedReader reader =
      new BufferedReader(new InputStreamReader(process.getInputStream()))) {
    String line;
    while ((line = reader.readLine()) != null) {
      System.out.println(line);
    }
  }
}

当出现问题时,仍然会打印堆栈跟踪(因为Java会打印从main()抛出的任何异常的堆栈跟踪),但是您知道process永远不会是{{1} }}。一般来说,你应该避免过于急切地捕捉异常 - 只有当你能做些什么时才能抓住它们。如果没有,将它们传递给调用者(可能将它们包装在一个新的异常类型中)。

如果你只是不关心异常并且在实践中不期望它们,你可以改为null。这仍然可以让您避免不必要的空值检查,但也不需要您使用RuntimeException注释您的方法:

throws