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

Что произойдет, если метод выдает исключение, которое не было указано в объявлении метода с помощью "throws"

Я никогда не использовал предложение "throws", и сегодня помощник сказал мне, что мне нужно указать в объявлении метода исключения, которые метод может выбросить. Тем не менее, я использую исключения без проблем, не делая этого, поэтому зачем это нужно, если на самом деле это необходимо?

4b9b3361

Ответ 1

Java имеет два разных типа исключений: отмечен Исключения и не отмечены Исключения.

Непроверенные исключения - это подклассы RuntimeException, и вам не нужно добавлять объявление бросков. Все остальные исключения должны обрабатываться в теле метода либо с помощью инструкции try/catch, либо с помощью объявления throws.

Пример для непроверенных исключений: IllegalArgumentException, который иногда используется для уведомления о том, что метод был вызван с незаконными аргументами. Никаких бросков не требуется.

Пример проверенных исключений: IOException, которые могут быть выбраны некоторыми методами из пакета java.io. Либо используйте try/catch, либо добавьте throws IOException в объявление метода и делегируйте обработку исключений вызывающему методу.

Ответ 2

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

Например, если вы хотите приостановить приложение, вы должны позвонить Thread.sleep(milliseconds);

Но декларация для этого метода говорит, что он выкинет InterruptedException

Декларация:

public static void sleep(long millis) throws InterruptedException

Поэтому, если вы хотите вызвать его, например, в своем основном методе, вы должны либо его поймать:

public static void main(String args[]) {
    try {
        Thread.sleep(1000);
    } catch(InterruptedException ie) {
        System.out.println("Opps!");
    }
}

Или запустите метод, объявив, что он выдает исключение:

public static void main(String args[]) throws InterruptedException {
    Thread.sleep(1000);
}

Ответ 3

Это может произойти даже при проверенных исключениях. И иногда он может ломать журнал.

Предположим, что метод библиотеки использует этот трюк, чтобы реализовать реализацию Runnable, которая может бросать IOException:

class SneakyThrowTask implements Runnable {

    public void run() {
        throwSneakily(new IOException());
    }

    private static RuntimeException throwSneakily(Throwable ex) {
        return unsafeCastAndRethrow(ex);
    }

    @SuppressWarnings("unchecked")
    private static <X extends Throwable>X unsafeCastAndRethrow(Throwable ex) throws X {
        throw (X) ex;
    }

}

И вы называете это следующим образом:

public static void main(String[] args) {
    try {
        new SneakyThrowTask().run();
    } catch (RuntimeException ex) {
        LOGGER.log(ex);
    }
}

Исключение никогда не будет зарегистрировано. И поскольку это проверенное исключение, вы не можете написать это:

public static void main(String[] args) {
    try {
        new SneakyThrowTask().run();
    } catch (RuntimeException ex) {
        LOGGER.log(ex);
    } catch (IOException ex) {
        LOGGER.log(ex); // Error: unreachable code
    }
}

Ответ 4

  • Вам нужно объявить проверенные исключения, которые ваш метод выбрасывает.
  • Если вы объявляете "throws Exception", который в значительной степени охватывает большинство, если не все проверенные исключения
  • Вы всегда можете исключить неконтролируемое исключение во время выполнения и не указывать.

Я уверен, что если вы попытаетесь выбросить проверенное исключение и не объявили метод как метать этот тип, этот код даже не будет компилироваться (теперь проверка).

EDIT, правильно, если вы попробуете что-то простое, например

public static void main(String[] args) {
   throw new Exception("bad");
}

появляется ошибка компиляции.

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