Throwable - это суперкласс всех ошибок и исключений в языке Java. Он имеет две прямые реализации: ошибка и исключение.
Ошибка - это подкласс, который указывает на серьезные проблемы, которые разумное приложение не должно пытаться уловить.
Исключение указывает на условия, которые разумное приложение может захотеть поймать.
Таким образом, вы не должны создавать свои собственные исключения, реализующие Throwable, и вы не должны перехватывать Throwable, потому что при этом вы также перехватываете тип ошибки, и ошибка не должна кэшироваться.
Стоит также упомянуть, что существует известный подтип Exception: RuntimeException. RuntimeException - это непроверенные исключения, то есть вы можете выбросить их, и вызывающая сторона не должна их перехватывать.
В течение многих лет велись большие споры об использовании Exception и RuntimeException. RuntimeException победил (некоторые, возможно, все еще думают об обратном, конечно), но в первые дни использование Exception считалось королем, поэтому несколько API-интерфейсов Java первых версий генерируют тип Exception, а современные Java-API и фреймворки большую часть времени генерируют RuntnimeException.
Что касается
Что на самом деле представляет здесь e? Я знаю, что это ссылка на объект исключения SQL, но что он будет печатать? Вызывает ли он метод toString?
Вы правы, e - это имя переменной типа SQLException, с которой вы можете работать внутри блока catch. И он вызывает свой метод toString, как каждый объект при добавлении в System.out.println ().
Редактировать: вывод, который я получаю, сильно отличается, когда я переопределяю метод toString и полностью удаляю его из моего исходного кода. Пожалуйста, объясните, почему?
В вашем примере вы расширяете Throwable, как уже упоминалось ранее, вы не должны этого делать. Все классы, расширяющие Throwable, будут использовать его реализацию toString (), в документации сказано:
/ **
* Возвращает краткое описание этого броска.
* Результатом является объединение:
*
- {@linkplain Class # getName () name} класса этого объекта
*
- ":" (двоеточие и пробел)
*
- результат вызова этого объекта {@link #getLocalizedMessage}
* метод
*
* Если {@code getLocalizedMessage} возвращает {@code null}, тогда просто
* имя класса возвращается.
*
* @ возвращаем строковое представление этого броска.
* /
public String toString ()
Итак, если вы переопределите это, как в вашем примере. Вы больше не получаете его преимуществ, ваш метод toString () печатает только то, что вы в него вставили.