Есть ли способ выбросить исключение без добавления объявления throws?
У меня следующая ситуация.
У меня есть Java-класс, который наследуется от другого базового класса и переопределяет метод.
Базовый метод не генерирует исключений и поэтому не имеет объявления throws ...
.
Теперь мой собственный метод должен иметь возможность генерировать исключение, но у меня есть выбор для
- Проглотить исключение
- Добавить объявление бросков
Оба не удовлетворяют, поскольку первый из них молча игнорирует исключение (нормально, я мог бы выполнить некоторое ведение журнала), а второй сгенерировал ошибки компилятора из-за разных заголовков методов.
public class ChildClass extends BaseClass {
@Override
public void SomeMethod() {
throw new Exception("Something went wrong");
}
}
Ответы
Ответ 1
Вы можете бросить непроверенные исключения, не объявляя их, если хотите. Исключенные исключения расширяются RuntimeException
. Throwables, которые расширяют Error
, также не отмечены, но должны использоваться только для действительно серьезных проблем (таких как неверный байт-код).
В качестве конкретного случая Java 8 добавила UncheckedIOException
для обертывания и перестройки IOException
.
Ответ 2
Вот трюк:
class Utils
{
@SuppressWarnings("unchecked")
private static <T extends Throwable> void throwException(Throwable exception, Object dummy) throws T
{
throw (T) exception;
}
public static void throwException(Throwable exception)
{
Utils.<RuntimeException>throwException(exception, null);
}
}
public class Test
{
public static void main(String[] args)
{
Utils.throwException(new Exception("This is an exception!"));
}
}
Ответ 3
Третий вариант заключается в том, чтобы отказаться от проверки исключений (как это обычно бывает в случае со стандартным API) и обернуть проверенное исключение в RuntimeException
:
throw new RuntimeException(originalException);
Возможно, вы захотите использовать более конкретный подкласс RuntimeException
.
Ответ 4
Я просто хочу добавить альтернативный ответ, просто как FYI:
Да, есть способ выбросить проверенное исключение без добавления объявления throws
, используя класс sun.misc.Unsafe
. Это описано в следующем сообщении в блоге:
Выбросить проверенное исключение из метода без объявления
Пример кода:
public void someMethod() {
//throw a checked exception without adding a "throws"
getUnsafe().throwException(new IOException());
}
private Unsafe getUnsafe() {
try {
Field field = Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
return (Unsafe) field.get(null);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
Однако это не рекомендуется. Лучше обернуть неконтролируемое исключение, как описано в некоторых других ответах.
Ответ 5
Почему бы вам не выбрасывать исключение? Это не должно быть объявлено.
Две альтернативы:
- wrap с проверенным исключением с непроверенным.
- не позволяйте компилятору знать, что вы выбрасываете проверенное исключение, например. Thread.currentThread() остановка (е).
- В Java 6 вы можете перестроить исключение, если оно
final
, а компилятор знает, какие проверенные исключения вы могли бы поймать.
- В Java 7 вы можете перестроить исключение, если оно действительно окончательно, т.е. вы не меняете его в коде.
Позднее более полезно, когда вы бросаете исключение проверки в свой код и ловите его в своем кодовом коде, но слои между ними ничего не знают об исключении.
Ответ 6
Здесь приведен пример перехвата проверенных исключений и их обертывания в неконтролируемом исключении:
public void someMethod() {
try {
doEvil();
}
catch (IOException e)
{
throw new RuntimeException(e);
}
}
Ответ 7
Да, есть почему, но не рекомендуется вообще использовать:
Небезопасный пакет Java
getUnsafe().throwException(new IOException());
Этот метод выдает проверенное исключение, но ваш код не заставил его перехватывать или реконструировать. Также как исключение времени выполнения.
Ответ 8
вы можете поймать исключение с блоком try-catch в переопределенном методе.
то вам не нужно объявлять throws-statement.
Ответ 9
Вы можете использовать любое исключение, полученное из RuntimeException или самого RuntimeException
или
используйте блок try для кода броска исключения и обрабатывайте его там