Java 如何使try块中声明的final变量用于catch/finally块?

Java 如何使try块中声明的final变量用于catch/finally块?,java,try-catch,Java,Try Catch,在try块中声明为final的变量fileReader和bufferedReader不能用于finally块。我不能在try块外声明它们,因为它们可能抛出异常。我希望变量也是最终的。如果您至少使用Java 7,您可以使用它来关闭资源。代码如下: public StringBuffer readFile(final File inputFile) { String tempLine; // variable declaration Logger log = Logger.getLo

在try块中声明为final的变量fileReader和bufferedReader不能用于finally块。我不能在try块外声明它们,因为它们可能抛出异常。我希望变量也是最终的。

如果您至少使用Java 7,您可以使用它来关闭资源。代码如下:

public StringBuffer readFile(final File inputFile) {
    String tempLine; // variable declaration
    Logger log = Logger.getLogger("Error Message");
    try {
        final FileReader fileReader = new FileReader(inputFile);
        final BufferedReader bufferedReader = new BufferedReader(fileReader);
        final StringBuffer content = new StringBuffer();
        while((tempLine=bufferedReader.readLine())!=null) {
            content.append(tempLine);
            content.append(System.getProperty("line.separator"));
        }
    }
    catch(FileNotFoundException e) {
        log.log(Level.WARNING, "File not found", e);
    }
    catch (IOException e) {
        log.log(Level.WARNING, "Couldn't Read file", e);
    }
    finally {
        bufferedReader.close();
        fileReader.close();
    }
    return content;
}

自Java 7以来,您可以编写如下内容:

public StringBuffer readFile(final File inputFile) {
    String tempLine; // variable declaration
    Logger log = Logger.getLogger("Error Message");
    try (final FileReader fileReader = new FileReader(inputFile)) {
        try (final BufferedReader bufferedReader = new BufferedReader(fileReader)) {
            final StringBuffer content = new StringBuffer();
            while((tempLine=bufferedReader.readLine())!=null) {
                content.append(tempLine);
                content.append(System.getProperty("line.separator"));
            }

            return content;
        }
    } catch (FileNotFoundException e) {
        log.log(Level.WARNING, "File not found", e);
    } catch (IOException e) {
        log.log(Level.WARNING, "Couldn't Read file", e);
    }
    // return null or throw exception;
}

这里,
fileReader
bufferedReader
是隐式关闭的。

也许你可以解释为什么你认为你需要整个代码片段中的任何变量都是
final
。因为你在finally块中真正做的就是关闭资源,这可能是@Marit的一个典型用例,因为它不会编译您无法确定是否执行了分配(位于
try
块中)。编译器将给您一个错误,说明变量
fileReader
bufferedReader
内容
可能尚未初始化。@TimBiegeleisen我猜它的代码样式如下:
public StringBuffer readFile(final File inputFile) {
    String tempLine; // variable declaration
    Logger log = Logger.getLogger("Error Message");
    final StringBuffer content = new StringBuffer();
    try (final FileReader fileReader = new FileReader(inputFile);
            final BufferedReader bufferedReader = new BufferedReader(fileReader)){        
        while((tempLine=bufferedReader.readLine())!=null) {
            content.append(tempLine);
            content.append(System.getProperty("line.separator"));
        }
    }
    catch(FileNotFoundException e) {
        log.log(Level.WARNING, "File not found", e);
    }
    catch (IOException e) {
        log.log(Level.WARNING, "Couldn't Read file", e);
    }
    return content;
}