Есть ли способ бросить исключение без добавления объявления бросков?
у меня следующая ситуация.
у меня есть Java-класс, который наследует от другого базового класса и переопределяется метод.
Базовый метод не создает исключений и, следовательно, не имеет throws ...
декларации.
теперь мой собственный метод должен быть в состоянии бросить исключение, но у меня тоже есть выбор к
- проглотить за исключением
- Добавить объявление бросков
оба не удовлетворяют, потому что первый будет молча игнорируйте исключение (хорошо, я мог бы выполнить некоторое ведение журнала), а второй будет генерировать ошибки компилятора из-за разных заголовков метода.
public class ChildClass extends BaseClass {
@Override
public void SomeMethod() {
throw new Exception("Something went wrong");
}
}
9 ответов:
вы можете бросить непроверенные исключения без необходимости объявлять их, если вы действительно хотите. Непроверенные исключения расширяются
RuntimeException
. Throwables, которые расширяютError
также не отмечены, но должны использоваться только для действительно серьезных проблем (таких как недопустимый байт-код).в качестве конкретного случая, Java 8 добавил
UncheckedIOException
для обертывания и перебросокIOException
.
вот такой трюк:
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!")); } }
третий вариант-отказаться от проверки исключений (как и сам стандартный API иногда) и обернуть проверенное исключение в
RuntimeException
:throw new RuntimeException(originalException);
вы можете использовать более конкретный подкласс
RuntimeException
.
Я просто хочу добавить альтернативный ответ, чисто как 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); } }
однако, это не рекомендуется. Лучше завернуть в непроверенный исключение, как указано в другие ответы.
почему бы вам не бросить непроверенное исключение? Это не должно быть объявлено.
два варианта
- оберните с проверенным исключением с непроверенным.
- не позволяйте компилятору знать, что вы бросаете проверенное исключение, например поток.currentThread().стоп (е);
- в Java 6 Вы можете перестроить исключение, если оно
final
и компилятор знает, что проверенные исключения, вы могли бы попасться.- в Java 7, вы можно перестроить исключение, если оно является фактически окончательным, т. е. вы не изменяете его в коде.
последнее более полезно, когда вы бросаете исключение проверки в свой код и ловите его в своем вызывающем коде, но слои между ними ничего не знают об исключении.
Да есть почему, но это не рекомендуется вообще вы можете использовать:
Java небезопасный пакет
getUnsafe().throwException(new IOException());
этот метод вызывает проверенное исключение, но ваш код не вынужден ловить или перестраивать его. Так же, как исключение времени выполнения.
вот пример для перехвата проверенных исключений и обертывания их в непроверенное исключение:
public void someMethod() { try { doEvil(); } catch (IOException e) { throw new RuntimeException(e); } }