Try-Catch-Finally - Final Block无法识别变量

时间:2014-06-18 18:50:19

标签: java try-catch-finally

首先我知道我应该使用try-catch和资源,但是我目前在系统上没有最新的JDK。

我在下面有以下代码,并且我正在尝试确保使用finally块关闭资源 reader ,但是下面的代码由于两个原因而无法编译。首先是读者可能尚未初始化,其次应该在自己的try-catch中捕获close()。这两个原因都没有打败初始try-catch块的对象?

我可以将finally块close()语句放在自己的try-catch中解决问题。但是,这仍然会导致读取器未被初始化的编译错误?

我假设我在某个地方出了问题?帮助赞赏!

干杯,

public Path [] getPaths()
    {
        // Create and initialise ArrayList for paths to be stored in when read 
        // from file.
        ArrayList<Path> pathList = new ArrayList();
        BufferedReader reader;
        try
        {
            // Create new buffered read to read lines from file
            reader = Files.newBufferedReader(importPathFile);
            String line = null;
            int i = 0;
            // for each line from the file, add to the array list
            while((line = reader.readLine()) != null)
            {
                pathList.add(0, Paths.get(line));
                i++;
            }
        }
        catch(IOException e)
        {
            System.out.println("exception: " + e.getMessage());
        }
        finally
        {
            reader.close();
        }


        // Move contents from ArrayList into Path [] and return function.
        Path pathArray [] = new Path[(pathList.size())];
        for(int i = 0; i < pathList.size(); i++)
        {
            pathArray[i] = Paths.get(pathList.get(i).toString());
        }
        return pathArray;
    }

2 个答案:

答案 0 :(得分:2)

没有其他方法可以初始化缓冲区并捕获异常。编译器总是正确的。

BufferedReader reader = null;
try {
    // do stuff
} catch(IOException e) {
    // handle 
} finally {
    if(reader != null) {
        try {
            reader.close();
        } catch(IOException e1) {
            // handle or forget about it
        }
    }
}

方法close总是需要一个try-catch-block,因为它声明它可能抛出IOException。如果呼叫在finally块或其他地方,则无关紧要。它只需要处理。这是一个经过检查的例外。

Read也必须初始化为null。恕我直言,这是超级无用的,但那是Java。这就是它的工作原理。

答案 1 :(得分:0)

而是检查reader是否为空,然后如下所示关闭它(仅当close()上的reader不为空或者是&#时,才应调用null reference 39;已经实例化了,否则你最终会得到 finally { if(reader != null) { reader.close(); } } 例外。

{{1}}