Что более эффективно в Java: проверять наличие недопустимых значений для предотвращения исключений или допускать исключения и ловить их?
Вот два блока пример кода, чтобы проиллюстрировать это различие:
void doSomething(type value1) {
ResultType result = genericError;
if (value1 == badvalue || value1 == badvalue2 || ...) {
result = specificError;
} else {
DoSomeActionThatFailsIfValue1IsBad(value1);
// ...
result = success;
}
callback(result);
}
против
void doSomething(type value1) {
ResultType result = genericError;
try {
DoSomeActionThatFailsIfValue1IsBad(value1);
// ...
result = success;
} catch (ExceptionType e) {
result = specificError;
} finally {
callback(result);
}
}
С одной стороны, вы всегда делаете сравнение. С другой стороны, я честно не знаю, что делают внутренности системы, чтобы генерировать исключение, бросать его, а затем запускать предложение catch. У этого есть звук менее эффективный, но если он не добавляет накладных расходов в случае без ошибок, тогда он более эффективен, в среднем. Что он? Все равно добавляет ли она подобную проверку? Это проверка там в неявном коде, добавленном для обработки исключений, даже с дополнительным уровнем явной проверки? Возможно, это всегда зависит от типа исключения? Что я не рассматриваю?
Предположим также, что все "плохие значения" известны - это очевидная проблема. Если вы не знаете все плохие значения - или список слишком длинный и не регулярный, то обработка исключений может быть единственным способом, в любом случае.
Итак, каковы плюсы и минусы каждого, и почему?
Вопросы, которые необходимо учитывать:
- Как ваш ответ изменяется, если значение "плохо" (будет выдавать исключение) большую часть времени?
- Насколько это будет зависеть от специфики используемой виртуальной машины?
- Если бы этот же вопрос был задан для языка-X, ответ был бы другим? (В общем, спрашивает, можно ли предположить, что проверяемые значения всегда более эффективны, чем полагаться на обработку исключений, просто потому, что они добавляют дополнительные накладные расходы текущими компиляторами/интерпретаторами.)
- (Новый) Активация исключения происходит медленно. Есть ли в блоке try накладные расходы, даже если исключение не выбрано?
Сходства на SO:
- Это похоже на образец кода в этом ответе, но утверждает, что они похожи только в концепции, а не в компилируемой реальности.
- Помещение похоже на этот вопрос, но в моем случае запросчик задачи (например, "что-то" ) не является вызывающим методом ( например "doSomething" ) (таким образом, нет возврата).
-
И этот очень похож, но я не нашел ответа на свой вопрос.
-
И похоже на слишком много других вопросов, за исключением:
Я не спрашиваю о теоретической передовой практике. Я спрашиваю больше о производительности и эффективности выполнения (что должно означать, что для конкретных случаев есть ответы, не связанные с мнением), особенно на платформах с ограниченными ресурсами. Например, если единственным плохим значением был просто нулевой объект, было бы лучше/эффективнее проверить это или просто попытаться использовать его и поймать исключение?