Какова стоимость блоков 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 ссылке на ответ нового идиота.
>try {
code
}
catch and finally blocks . . .
сегмент в Примере с надписью код содержит одну или несколько легальных строк кода, которые могут вызвать исключение.
Итак, если вы сомневаетесь в своем условии, что это будет throw
an exception
положите его внутрь.В противном случае положите снаружи.
if (condition) {
try {
//something
} catch(SomeEx ex) {}
}
лучше использовать, так как он выполняет блок try, если условие в порядке.JVM компилирует блок try и проверяет блок catch или блок finally. Я думаю, что преимущество не во время компиляции, а во время выполнения. Время компиляции я думаю, что нет никакого преимущества вообще
исключения должны быть исключительным случаем, а не каждый раз, когда выполняется код. Так что лучше проверить перед try
ing !
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.