在Java中实现try / catch的更合适的技术:
A:
Date lastMod = null;
BufferedReader inFile = null;
try {
inFile = new BufferedReader(new FileReader("C:\\Java\\settings.ini"));
try {
lastMod = new Date(Long.parseLong(inFile.readLine()));
} catch (IOException e) {
e.printStackTrace();
}
} catch(FileNotFoundException e) {
e.printStackTrace();
}
或B:
Date lastMod = null;
BufferedReader inFile = null;
try {
inFile = new BufferedReader(new FileReader("C:\\Java\\settings.ini"));
lastMod = new Date(Long.parseLong(inFile.readLine()));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
另外,使用BufferedReader的长代码块来跟随try / catch块是错误的,还是首选在try / catch中包含长代码块?
例如:
public static void main(String[] args) {
Date lastMod = null;
BufferedReader inFile = null;
try {
inFile = new BufferedReader(new FileReader("C:\\Java\\settings.ini"));
lastMod = new Date(Long.parseLong(inFile.readLine()));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//Long block of code using inFile
inFile.readLine();
inFile.close();
对战:
public static void main(String[] args) {
Date lastMod = null;
BufferedReader inFile = null;
try {
inFile = new BufferedReader(new FileReader("C:\\Java\\settings.ini"));
lastMod = new Date(Long.parseLong(inFile.readLine()));
//Long block of code using inFile
inFile.readLine();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
inFile.close();
}
答案 0 :(得分:1)
B更具可读性。如果你有逻辑在两者之间执行,那么你必须使用A
在第二个例子中,使用finally的第二个版本对于确保无论如何都会调用close是至关重要的(即使函数首先返回)没有finally的第一个版本实际上是错误的,因为你可能会用尽所有文件句柄并且无法打开更多文件。
作为补充说明,您可能需要在调用close时检查null。如果你使用的是java 7,那么使用"try with resources"更好。
答案 1 :(得分:1)
对于第一个问题:解决方案A增加了不必要的复杂性。使用B或,如果您使用的是Java 7,请尝试使用资源:
Date lastMod = null;
try (BufferedReader inFile = new BufferedReader(new FileReader("C:\\Java\\settings.ini"))){
lastMod = new Date(Long.parseLong(inFile.readLine()));
} catch (FileNotFoundException | IOException e) {
e.printStackTrace();
}
对于第二个问题:在第一个版本中,如果BufferedReader
创建引发异常怎么办?您将使用br
之后为null并抛出NullPointerException。此外,如果发生其他事情,您将不会调用inFile.close()
,因此您确实需要finally
。出于所有这些原因,再次,第二种解决方案更好。
如果您正在使用try-with-resouces(Java 7),当然,您不需要finally块来释放BufferedReader。
答案 2 :(得分:0)
正确的技术可能还包括不捕获您的异常,但允许它们冒泡到呼叫者。总是使用finally块来清理任何可能耗尽资源的状态,但是在父例程中捕获异常通常会更好,而不是抛出异常的子例程。
一般来说,如果在调用例程中知道子例程是否成功会有所帮助,那么该子例程不应该捕获它的异常,但应该允许它们冒泡到它们的调用者。