我有这个方法,我正在尝试使用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
中的文件。为什么我会收到此错误以及如何修复它?
由于
答案 0 :(得分:10)
当您使用try with resources时,您不需要显式关闭它们。 try-with-resources将负责关闭这些资源。
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)
将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>