Подтвердить что ты не робот

Есть ли способ выбросить исключение без добавления объявления throws?

У меня следующая ситуация.

У меня есть Java-класс, который наследуется от другого базового класса и переопределяет метод. Базовый метод не генерирует исключений и поэтому не имеет объявления throws ....

Теперь мой собственный метод должен иметь возможность генерировать исключение, но у меня есть выбор для

  • Проглотить исключение
  • Добавить объявление бросков

Оба не удовлетворяют, поскольку первый из них молча игнорирует исключение (нормально, я мог бы выполнить некоторое ведение журнала), а второй сгенерировал ошибки компилятора из-за разных заголовков методов.

public class ChildClass extends BaseClass {

        @Override 
        public void SomeMethod() {
            throw new Exception("Something went wrong");
        }
}
4b9b3361

Ответ 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 для кода броска исключения и обрабатывайте его там