Является ли хорошей практикой / недорогим вызовом метода, который не генерирует исключение внутри блока try в Java?

#java #try-catch

#java #попробуйте-catch

Вопрос:

например, в настоящее время у меня есть эта реализация:

         ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try
        {
           //write to bos
        } 
        catch (Exception exception)
        {
            throw new exception
        }

       somemethod(bos, foo1, foo2);
    }
  

Является ли это хорошей / плохой практикой / недорогой / затратной или имеет какое-либо значение, если я изменю этот метод на следующий:

         try(ByteArrayOutputStream bos = new ByteArrayOutputStream())
        {
           //write to bos
           somemethod(bos, foo1, foo2);
        } 
        catch (Exception exception)
        {
            throw new exception
        }

      }
  

Пришлось переместить некоторый метод внутри try, поскольку ему нужна переменная bos.

Ответ №1:

С точки зрения производительности? Не имеет ни малейшего значения.

С точки зрения стиля кода: это другая история. Вы не должны помещать методы в try блок, если только связанный блок catch и / или finally не предназначен для обработки этого. Вместо этого сделайте это:

 ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
    // write to bos
} catch (Exception e) {
   // handle things - you really want to catch ALL exceptions?
}
somemethod(bos, foo1, foo2);
  

т. е. переместить объявление наружу. Вы даже можете сделать что-то вроде:

 String foo; // no value assigned yet
try (someResource) {
   foo = readFromIt; // assigned here though.
} catch (IOException e) {
   throw new ResourceRetrievalException(e);
}
System.out.println(foo); // hey I'm using foo, outside the try!
  

ПРИМЕЧАНИЕ: BAOS не нуждается в блоке try. Если ваш линтер жалуется на это, найдите линтер получше. BAOS на самом деле не является ресурсом, который нуждается в закрытии, сборщик мусора выполнит эту работу.