4

这将被认为是在 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();
    }
4

3 回答 3

1

B 更具可读性,当内部 try 块之后,外部 try 块之前没有任何事情发生时。如果您有逻辑要在两者之间执行,那么您必须使用 A

在第二个示例中,使用 finally 的第二个版本对于确保无论如何都会调用 close(即使函数首先返回)至关重要。没有 finally 的第一个版本实际上是错误的,因为您可能会用完所有文件句柄并且无法打开更多文件。

作为附加说明,您可能需要在调用 close 时检查 null。如果您使用的是 java 7,最好使用"try with resources"

于 2013-03-08T04:24:24.630 回答
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创建抛出异常怎么办?您将使用brafter which is null 并抛出 NullPointerException。此外,如果发生其他事情,您将不会调用inFile.close(),因此您确实需要finally. 由于所有这些原因,第二个解决方案再次更好。

如果您正在使用 try-with-resouces (Java 7),当然,您不需要 finally 块来释放您的 BufferedReader。

于 2013-03-08T04:27:08.120 回答
0

适当的技术可能还包括不捕获您的异常,而是允许它们冒泡给调用者。务必使用 finally 块来清理任何可能会占用资源的状态,但通常最好在父例程中捕获异常,而不是在引发异常的子例程中捕获异常。

一般来说,如果在调用例程中知道子例程是否成功会有所帮助,那么该子例程不应该捕获它的异常,而应该允许它们冒泡到调用者那里。

于 2013-03-08T04:47:26.020 回答