使用Java中的资源尝试时出错

时间:2013-11-22 20:54:43

标签: java try-catch-finally finally try-with-resources

我有这个方法,我正在尝试使用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(); 
        }

    }

我在finallyfiles cannot be resolved to a variable中遇到编译错误 我参考了try with block中的文件。为什么我会收到此错误以及如何修复它?

由于

5 个答案:

答案 0 :(得分:10)

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

基于try-wtih-resource document

  

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

答案 1 :(得分:5)

取自Java Language Spec(14.20.3):

  

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

     

ResourceSpecification使用初始化表达式声明一个或多个局部变量,以充当try语句的资源

因此您不再需要关闭资源。 Try-with-resources会自动为您执行此操作,而您的FileReader只能在try块中使用。因此,你得到了编译错误。

答案 2 :(得分: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(); 
        }

    }

答案 3 :(得分:0)

您要执行的代码是Java 7之前的老式代码,在Java 7中必须关闭资源以避免内存泄漏。但是在New Java 7中,要聪明地使用它,即使无法访问它,也不必关闭资源。

答案 4 :(得分: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>