每当我在代码中使用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();
}
}
答案 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