正确尝试抓住设计

时间:2013-03-08 04:20:37

标签: java try-catch

在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();
    }

3 个答案:

答案 0 :(得分:1)

当外部try块之前内部try块之后没有任何内容发生时,

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块来清理任何可能耗尽资源的状态,但是在父例程中捕获异常通常会更好,而不是抛出异常的子例程。

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