Есть ли способ бросить исключение без добавления объявления бросков?
у меня следующая ситуация.
у меня есть 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); } }