2016-08-16 2 views
-1

С JDK 6 и ниже я видел множество фрагментов кода с блоками try - finally, как показано ниже.Java try - окончательный дизайн

private void doSomething() throws IOException { 
    FileReader reader = null; 
    try { 
     reader = new FileReader("someFile"); 
     ..... 
    } finally { 
     if(reader != null){ 
      reader.close(); 
     } 
    } 
} 

Зачем инициализировать считыватель нулем, а затем назначить его в блоке try. Будет ли ниже шаблон лучше (интересно, если я что-то пропустил)? Мои причины ... мы избегаем нулевой проверки в блоке finally, и если читатель не смог инициализироваться, мне больше нечего делать.

private void doSomething() throws IOException { 
    FileReader reader = new FileReader("someFile"); 
    try { 

     ..... 
    } finally { 
     reader.close(); 
    } 
} 
+0

Не очень! Если конструктор выбрасывает исключение, остальная часть метода ничего не сделает. См. Предложение бросков? – Stackee007

ответ

0

Один, имеющий декларацию, не представляет никаких проблем, но по мере добавления дополнительных ресурсов, требующих закрытия, вы начинаете получать кучу незакрытых ресурсов. Лучше объявить их снаружи как null, и обрабатывать закрытие внутри с помощью finally.

Бедная реализация

private void doSomething() throws IOException { 
    FileReader reader = new FileReader("someFile"); 
    FileWriter writer = new FileWriter("someFile2"); //throws exception 
    try { 

     ..... 
    } finally { 
     reader.close(); 
     writer.close(); 
    } 
} //reader remains unclosed 

Теперь у нас есть незаконченный FileReader, потому что другой конструктор бросил исключение.

Надлежащее выполнение

private void doSomething() throws IOException { 
    FileReader reader = null; 
    FileWriter writer = null; 
    try { 
     reader = new FileReader("someFile"); 
     writer = new FileWriter("someFile2"); //throws exception 
    } finally { 
     if(reader != null) 
      reader.close(); //closes properly 
     if(writer != null) //skipped 
      writer.close(); 
    } 
} 
+0

Я не имею дело с несколькими ресурсами ... так что это не применяется. – Stackee007

+0

@ Stackee007 Это соглашение, и если по дороге вы решите использовать два ресурса, вам не придется реорганизовывать свой код для его поддержки. – Compass

Смежные вопросы