Накладные расходы, связанные с Exception и Throwable в Java - PullRequest
27 голосов
/ 25 января 2010

Я знаю

throw new Exception();

имеет довольно большие издержки, так как создает полный стекTrace и т. Д.
Есть ли

throw new Throwable();

присутствует та же проблема? Это поведение унаследовано, или бросок Throwable имеет меньшие (o нет) накладные расходы?

EDIT
С точки зрения аналитика , пользователь, вставляющий неправильный пароль, является исключением из обычного порядка выполнения программы. Так что если у меня есть:

public Session newSession() {  
  validate_user_and_password();   
}

создание исключений UserNotValidException будет звучать правильно с точки зрения аналитиков .
Возвращение null или 0 звучит некорректно, если ваш код имеет довольно хорошую абстракцию. Я просто хотел знать, смогу ли я на самом деле реализовать это в коде, или мне просто нужно оставить это для теории.

Существует большая разница между исключением из точки зрения программирования и исключением из точки зрения аналитика.

Примечание: я привел очень простой и глупый пример, это не совсем мой случай.
Примечание 2: я знаю, что возвращение null было бы обычным делом, но я должен правильно абстрагировать и код OO, и лично я не вижу в этом никакого вреда.

Ответы [ 8 ]

49 голосов
/ 25 января 2010

Throwable также создает трассировку стека при его создании. Из документов Java для Throwable:

throwable содержит снимок стека выполнения своего потока на момент его создания.

Таким образом, с точки зрения затрат на создание трассировки стека, не должно быть никакой разницы между Exception и Throwable.

Если вы используете исключения для «исключительных событий» (как и должно быть), то вам не следует слишком беспокоиться об издержках трассировки стека. Исключительное событие редко происходит в работающем коде. Таким образом, исключения не должны оказывать существенного влияния на производительность нормального кода.

37 голосов
/ 25 января 2010

Нет, вам нужен собственный подкласс, чтобы избежать этого эффекта.

Exception ex = new Exception() {
    @Override public Throwable fillInStackTrace() {
        return this; // and do nothing else
    }
};

Это создает экземпляр исключения, который не будет заполнять трассировку стека (создание делегатов исключений для fillInStackTrace для фактического заполнения трассировки стека) и, следовательно, будет дешев в создании.

3 голосов
/ 25 января 2010

С JIT-компиляцией, на самом деле, все еще не так много, что можно было бы услышать, как выбрасывать Exception в Java. Но выбрасывание Throwable не сильно отличается, так как вы также получите трассировку стека.

Если вам интересно, есть очень интересная статья под названием «Эффективная обработка исключений Java при компиляции точно в срок» ( ссылка ). Не легкое чтение, но довольно информативное.

1 голос
/ 24 февраля 2017

Вы можете взглянуть на исходный код двух классов, чтобы увидеть, что Exception не делает ничего, кроме предоставления тех же конструкторов, что и Throwable. Все мясо, а следовательно, и над головой, живет в Throwable.

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

1 голос
/ 22 января 2014

Throwable является родительским классом исключения. поэтому Exception class наследуется от Throwable.

1 голос
/ 25 января 2010

Вы никогда не должны бросать или ловить Throwable. Сфера действия исключения слишком велика.

Как указывалось ранее, исключения должны использоваться только там, где это необходимо, т.е.к ситуации, которая породила их.Помимо этого, перехват Throwable подразумевает множество исключений, таких как OutOfMemoryException.Ошибка такой величины не может быть исправлена ​​(легко) и не должна обрабатываться разработчиком.

0 голосов
/ 12 мая 2015

Throwable vs. Exception

Java Exception

Как сказал @mangoDrunk: «Throwable - это суперкласс исключений и ошибок».

0 голосов
/ 25 января 2010

java.lang.Exception расширяет java.lang.Throwable, так что это те же накладные расходы.Из Javadoc :

Класс Throwable является суперклассом всех ошибок и исключений в языке Java.Только объекты, которые являются экземплярами этого класса (или одного из его подклассов), выбрасываются виртуальной машиной Java или могут быть выброшены оператором throw Java.Точно так же только этот класс или один из его подклассов могут быть типом аргумента в предложении catch.

Экземпляры двух подклассов, Error и Exception, обычно используются для указания того, что возникли исключительные ситуации.Как правило, эти экземпляры создаются заново в контексте исключительной ситуации, чтобы включать соответствующую информацию (например, данные трассировки стека).

...