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