Накладные расходы, связанные с Exception vs Throwable в Java

Я знаю

throw new Exception();

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

throw new Throwable();

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

ИЗМЕНИТЬ
С точки зрения аналитик пользователь, вставляющий неправильный пароль, является исключением из обычного порядка выполнения программы. Поэтому, если у меня есть:

public Session newSession() {  
  validate_user_and_password();   
}

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

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

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

Ответы

Ответ 1

Throwable также создает стек, когда он создается. Из java docs для Throwable:

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 8

Throwable vs. Exception

Java Exception

Как @mangoDrunk сказал: "Throwable - суперкласс исключения и ошибки".