Исключение с try-catch и циклом в Java

#java #exception #for-loop

#java #исключение #for-цикл

Вопрос:

В Java, в чем разница (с точки зрения производительности) между:

 for (int i = 0; i < count; i  ) {
    try {
        // code that throws Exception
    } catch (Exception e) {
        e.printStackTrace();
    }
}
  

и

 try {
    for (int i = 0; i < count; i  ) {
        // code that throws Exception
    }
} catch (Exception e) {
    e.printStackTrace();
}
  

Ответ №1:

В вашей первой версии цикл продолжается, если он попадает в исключение, во второй версии цикл продолжается после блока catch. Это самое важное отличие этих фрагментов кода.

Комментарии:

1. Спасибо. Есть ли какое-либо снижение производительности, если я помещаю try-catch в цикл?

2. @Martin: эти циклы выполняют разные действия. Обсуждения производительности, связанные с кодом, который выполняет разные вещи, бессмысленны. Если вы действительно, действительно, действительно, действительно, действительно заинтересованы в сравнении производительности кода, который выполняет разные вещи, вы можете просто измерить это.

3. @Martin08, если это ответ, примите его, чтобы другие, читающие это, могли учиться.

Ответ №2:

Вы можете использовать оба, но все зависит от того, что вы хотите, чтобы это делало. Если вы хотите продолжить выполнение после завершения цикла один раз, тогда вы делаете это первым способом. Если вы хотите перехватить исключение, а затем прекратить выполнение цикла, тогда вы делаете второй. С точки зрения производительности все зависит от того, что вы хотите с этим сделать.

Ответ №3:

Основное отличие заключается в том, что в первом фрагменте кода, даже если из блока try генерируется исключение и оно перехвачено, выполнение цикла for продолжается. Во втором фрагменте, если генерируется исключение, цикл for завершается. Это потому, что весь цикл находится внутри блока try.

Ответ №4:

Нет, я совершенно уверен, что здесь нет абсолютно никакой разницы с точки зрения производительности (игнорируя очевидный факт о цикле). В обоих случаях вы создаете ровно одну запись в таблице исключений — только значения PC (т. Е. в каком диапазоне допустимо исключение) будут немного отличаться.

т.е. если вы предполагаете, что приведенная ниже таблица исключений, единственное, что изменится, — это значения x, y и z..

 Exception table:
   from to target type
     x y z <Class java.lang.Exception>
  

Ответ №5:

Поскольку вы спросили о производительности в двух версиях кода, я вспомнил «Практическую Java» (Addison-Wesley 2000), которая рекомендует в Praxis 23: Размещать блоки try / catch вне циклов.

Причина связана с запуском кода на JVM с выключенным компилятором JIT. В этом случае отсутствие JIT-оптимизации во время выполнения приводит к дополнительным ветвлениям в коде операции, что приводит к снижению производительности.

Вы можете прочитать документы JIT 2014 года здесь:http://www.oracle.com/technetwork/articles/java/architect-evans-pt1-2266278.html

Ответ №6:

Помимо разницы в вашей логике с продолжением for. Нет заметной разницы между

 try {
lots of stuff which might not throw any exception
something that throws exception
} catch (Exception e) {
}
  

и

 lots of stuff which might not throw any exception
try {
something that throws exception
} catch (Exception e) {
}