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


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

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

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

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

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

public class ChildClass extends BaseClass {

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

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);
   }
}

вы можете поймать исключение с блоком try-catch в переопределенном методе. тогда вам не нужно объявлять throws - заявление.

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

или

используйте try-block Для кода исключения и обработайте его там