7

我有这种方法,我正在尝试使用 Java SE 7 的资源。

private void generateSecretWord(String filename){

        try (FileReader files = new FileReader(filename)){
            Scanner input = new Scanner(files);
            String line = input.nextLine();
            String[] words = line.split(",");
            Collections.shuffle(Arrays.asList(words));
            if (words[0].length()>1){
                secretWord = words[0];
                return;
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        finally {
            if (files!=null) files.close(); 
        }

    }

finally我在块中收到编译错误,files cannot be resolved to a variable 我在try with block. 为什么我会收到此错误以及如何解决?

谢谢

4

5 回答 5

10

当您对资源使用 try 时,您不需要显式关闭它们。try-with-resources 将负责关闭这些资源。

基于try-wtih-resource 文档

try-with-resources 语句是声明一个或多个资源的 try 语句。资源是程序完成后必须关闭的对象。try-with-resources 语句确保每个资源在语句结束时关闭。

于 2013-11-22T20:55:42.390 回答
6

取自Java 语言规范(14.20.3):

try-with-resources 语句使用变量(称为资源)参数化,这些变量在执行 try 块之前被初始化,并在执行 try 块后以与初始化相反的顺序自动关闭。当资源自动关闭时,通常不需要catch 子句和finally 子句。

ResourceSpecification 用初始化表达式声明一个或多个局部变量,作为try 语句的资源。

因此,您不再需要关闭资源。Try-with-resources 会自动为您执行此操作,并且您FileReader将仅在该try块中可用。因此,您会得到该编译错误。

于 2013-11-22T20:55:50.843 回答
2

由于没有人提到这一点,如果您想手动处理它,您可以执行以下操作:

private void generateSecretWord(String filename){
        FileReader files = null;
        try {
            files = new FileReader(filename);
            Scanner input = new Scanner(files);
            String line = input.nextLine();
            String[] words = line.split(",");
            Collections.shuffle(Arrays.asList(words));
            if (words[0].length()>1){
                secretWord = words[0];
                return;
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        finally {
            if (files!=null) 
                files.close(); 
        }

    }
于 2013-11-22T21:05:04.437 回答
0

您尝试执行的代码是 Java 7 之前的老式代码,必须关闭资源以避免内存泄漏。但是在 New Java 7 中巧妙地使用它,即使最终阻塞也无法访问资源,也没有必要关闭资源。

于 2018-08-24T05:05:16.890 回答
0

在 Pom.xml 中将 java 设置为 1.7 或更高,如下所示,

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <java.version>1.8</java.version>
</properties>
于 2020-09-12T20:22:07.883 回答