Наличие проблем с "попробуй с ресурсами"

УТОЧНИТЬ: Я не могу даже скомпилировать из-за сообщений от Eclipse. Первый фрагмент кода: input а также inputBuffer не признаются Второй фрагмент кода, Eclipse хочет, чтобы я переключил переключатель "Соответствие и JRE на 1,7"

Я новичок в попытке попробовать с ресурсами, и я не совсем понимаю синтаксис или что я делаю неправильно. Вот мой код

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 (...)... но как?

  • Также для этого необходимо, чтобы я переключил "Соответствие и JRE на 1,7". Я не знаю, что это значит и как это повлияет на мою программу, я не хочу делать это, пока кто-нибудь не объяснит, что все это значит, или если я что-то не так делаю.

РЕДАКТИРОВАТЬ

Я переместил декларацию перед попыткой блока и инициализировал с нулем, это нормально?

FileReader input = null;
BufferedReader  inputBuffer = null;

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

2 ответа

Решение

Сначала объявите input и inputBuffer перед попыткой {}catch(){}

как это

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.

Вы должны использовать 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 который оборачивает другой Readerэта основа Reader тоже будет закрыт.

Другие вопросы по тегам