【问题标题】:Having problems with "try with resources"“尝试资源”有问题
【发布时间】:2012-12-16 18:28:54
【问题描述】:

澄清:由于来自 Eclipse 的消息,我什至无法编译。第一个代码 sn -p:inputinputBuffer 无法识别。第二个代码sn -p,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);
    ...
}   ...

【问题讨论】:

  • 你有一些堆栈跟踪吗?
  • 我还没有编译。问题在于来自 Eclipse 的错误消息。在第一个示例中,input.close() 无法识别 input,因为它位于 try 块中。在第二个示例中,我收到另一条系统消息。
  • 如果你有 try 块,不管 finally 总是有异常或无异常执行。你得到什么错误并使用 fnfe.printStackTrace();
  • 如果您对新的“使用资源尝试”不满意,旧的方法很好。欲了解更多信息..在下面查看我的答案

标签: java try-with-resources


【解决方案1】:

必须使用 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) {
          ......
    }

还有一点很重要: 如果你关闭一个包裹另一个ReaderBufferedReader,这个底层Reader也将被关闭。

【讨论】:

  • 啊,我只有 java 1.6。我不知道如何更新或这将如何影响我。我使用日食。对于我目前的困境,除了 try-with-resources 之外还有其他解决方案吗?
  • @Kalec 然后使用 finally 块。
  • @AjayGeorge 如果我这样做,它会说“输入无法解析”。与 catch 块相同。
  • 您是否尝试在 try-catch 之前声明那些 Readers(例如输入)?
  • @Kalec 如果你已经在你的机器上安装了 Java 7,那么你可以这样做。 Windows->首选项->Java->已安装的JRE->执行环境。从这里你可以选择你的java资源
【解决方案2】:

在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 块中的上述资源。

【讨论】:

  • 谢谢。当然是因为我在 try 块中声明了它们!
  • “局部变量可能没有被初始化”如果我按照你的方式尝试(在尝试块之前声明)。
  • 对不起!!这样做: FileReader input= null; BufferedReader inputBuffer = null;
  • 你必须用 null 来初始化这些变量。喜欢FileReader input = null; 编辑:嗯,你更快;)
  • 您必须在关键字前后使用`
猜你喜欢
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-20
  • 1970-01-01
  • 2016-06-06
相关资源
最近更新 更多