Исключение с try-catch и loop в Java - PullRequest
7 голосов
/ 12 июня 2011

В 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();
}

Ответы [ 6 ]

7 голосов
/ 12 июня 2011

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

5 голосов
/ 12 июня 2011

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

1 голос
/ 13 января 2016

Поскольку вы спрашивали о производительности в двух версиях кода, мне вспоминается "Практическая 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

1 голос
/ 12 июня 2011

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

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

Exception table:
   from to target type
     x y z <Class java.lang.Exception>
1 голос
/ 12 июня 2011

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

0 голосов
/ 12 июня 2011

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

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) {
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...