3

澄清:由于来自 Eclipse 的消息,我什至无法编译。第一个代码片段:input并且inputBuffer无法识别。第二个代码片段,Eclipse 要我切换开关“Compliance and JRE to 1.7”

我是 try-with-resources 的新手,我不太理解语法或我做错了什么。这是我的代码

try {
   FileReader input = new FileReader(this.fileName);
   BufferedReader  inputBuffer = new BufferedReader (input);

   String line;
   while ((line = inputBuffer.readLine()) != null) {
       String[] inputData = line.split(",");

        Node<Integer> newNode = new Node<Integer>(Integer.parseInt(inputData[0]),
                                                  Integer.parseInt(inputData[1]));
        this.hashMap.add(newNode);
   }

//inputBuffer.close();
//input.close();

}catch (NumberFormatException nfe){
    System.out.println(
         "Repository could not load data due to NumberFormatException: " + nfe); 
}catch (FileNotFoundException fnfe) {
    System.out.println("File not found, error: " + fnfe);
}finally { 
    inputBuffer.close();
    input.close();
}

finally 块不起作用,所以我想尝试

try (FileReader input = new FileReader(this.fileName)) {
      ......        
}catch (FileNotFoundException e) {
      ......
}finally {
      inputBuffer.close();
      input.close();
}

然而

  • 我还应该将 BufferedReader 添加到try (...)...但是如何?

  • 这也需要我将“Compliance and JRE to 1.7”切换。到目前为止,我不知道这意味着什么以及这将如何影响我的程序,在有人解释这一切意味着什么或者我做错了什么之前,我不愿意这样做。

编辑

我在 try 块之前移动了声明并用 null 初始化,这是“ok”吗?

FileReader input = null;
BufferedReader  inputBuffer = null;

try {
    input = new FileReader(this.fileName);
    inputBuffer = new BufferedReader (input);
    ...
}   ...
4

2 回答 2

6

必须使用 Java 7才能使用 try-with-resources 语句。
try-with-resources 块也使用 AutoClosable 接口,因此在 finally-块中省略那些关闭。它们将被自动调用。
如果你想使用 BufferedReader 试试这个:

try (BufferedReader bufRead = new BufferedReader(new FileReader(this.fileName))) {
      ......        
}catch (FileNotFoundException e) {
      ......
}

您还可以像这样使用多个资源:

try (FileReader input = new FileReader(this.fileName);
     BufferedReader bufRead = new BufferedReader(input) ) {
          ......        
    }catch (FileNotFoundException e) {
          ......
    }

还有一件重要的事情: 如果你关闭一个BufferedReader包裹另一个的 a Reader,这个底层Reader也将被关闭。

于 2012-12-16T18:32:32.777 回答
5

在 try{}catch(){} 之前首先声明 input 和 inputBuffer

像这样

FileReader input = null;
BufferedReader  inputBuffer = null;
try
{
 ------
 -------


}

在 finally 的第一个块中:检查以下两个条件

if(inputBuffer != null)
{
    inputBuffer.close();
}
if(input != null)
{
      input.close();
}

第二:如果您想尝试多个资源,请执行以下操作:

try ( OpenDoor door = new OpenDoor(); OpenWindow window = new OpenWindow() ) 
{

}

在这种情况下,不需要关闭 finally 块中的上述资源。

于 2012-12-16T18:36:03.793 回答