Какова стоимость блоков try catch?

насколько лучше это:

 if (condition) {
  try {
   //something
  } catch(SomeEx ex) {}
 }

вместо этого:

 try {
   if (condition) {
     //something
   }
 } catch(SomeEx ex) {}

что на самом деле делает JVM, когда я вхожу в блок try?

изменить: Я не хочу знать, что во втором примере всегда заходите, чтобы попробовать... Пожалуйста, ответьте на вопрос.

6 ответов


выполнение мудрое во время выполнения, пока нет исключений, попробуйте ничего не стоит. Это только стоит времени выполнения, как только возникает исключение. И в этой ситуации гораздо медленнее, чем оценка if.

в спецификации JVM вы видите, что на пути выполнения не генерируется дополнительный байтовый код: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-3.html#jvms-3.12


try {if (condition) {...}} catch(SomeEx ex) {}

здесь вы обработали исключение, если оно возникло состояние if также, если возникло внутри if-block.

if (condition) {try {...} catch(SomeEx ex) {}}

здесь вы обрабатываете исключение, если возникает только внутри if-block. Если что-то пойдет не так, если условие, то оно не будет обработано.

так это зависит от фактического senario.


с точки зрения производительности это должно быть то же самое. Выбрасывание исключения является дорогостоящей операцией (для начала необходимо создать и заполнить stacktrace). Само существование блока try не имеет (или незначительного) штрафа за производительность.

посмотреть должны ли блоки Java try быть максимально плотно ограничены.

что на самом деле делает JVM, когда я вхожу в блок try?

с JLS 14.20.1. Исполнение попробуй-поймай:

оператор try без блока finally выполняется первым выполнением блока try. Тогда есть выбор:

  • Если выполнение блока try завершается нормально, то дальнейшие действия не предпринимаются и оператор try завершается нормально.

  • Если выполнение блока try завершается резко из-за броска значения V, то есть выбор:

    • Если тип времени выполнения V является назначением, совместимым с (§5.2) захватываемым классом исключений любого предложения catch оператора try, то выбирается первое (самое левое) такое предложение catch. Значение V присваивается параметру выбранного предложения catch, и блок этого предложения catch выполняется, а затем есть выбор:

      • Если этот блок завершается нормально, то оператор try завершает обычно.

      • Если этот блок завершается внезапно по какой-либо причине, то оператор try завершается внезапно по той же причине.

    • Если тип времени выполнения V не является назначением, совместимым с захватываемым классом исключений любого предложения catch оператора try, то оператор try завершается внезапно из-за броска значения V

  • Если выполнение try блок завершается резко по любой другой причине, тогда try оператор завершается резко по той же причине.

EDIT:

для полного описания исключения см. JVM 2.10 ссылке на ответ нового идиота.


если вы видите oracle docs

>try {
    code
}
catch and finally blocks . . .

сегмент в Примере с надписью код содержит одну или несколько легальных строк кода, которые могут вызвать исключение.

Итак, если вы сомневаетесь в своем условии, что это будет throw an exception положите его внутрь.В противном случае положите снаружи.


if (condition) {
  try {
   //something
  } catch(SomeEx ex) {}
 }

лучше использовать, так как он выполняет блок try, если условие в порядке.JVM компилирует блок try и проверяет блок catch или блок finally. Я думаю, что преимущество не во время компиляции, а во время выполнения. Время компиляции я думаю, что нет никакого преимущества вообще


исключения должны быть исключительным случаем, а не каждый раз, когда выполняется код. Так что лучше проверить перед trying !

if (condition) {
  try {
    //something
  } catch(SomeEx ex) {}
}

убедитесь , if (condition) сам не бросает Exception.

Это зависит от вашего использования и функциональность . Например, это было бы лучше:

if (someObject!=null) {
  try {
     someObject.getSomething(); // getSomething() potentially throws some Exception
  } catch(SomeEx ex) {}
}

что на самом деле JVM делает, когда я вхожу в блок try?

читать JVM spec 2.10.