Что происходит, если метод генерирует исключение, которое не было указано в объявлении метода с помощью throws - PullRequest
20 голосов
/ 03 февраля 2011

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

Ответы [ 6 ]

24 голосов
/ 03 февраля 2011

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

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

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

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

13 голосов
/ 03 февраля 2011

Если метод объявлен с ключевым словом 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);
}
6 голосов
/ 03 февраля 2011

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

Предположим, что метод библиотеки использует этот трюк, чтобы позволить реализацию 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 голосов
/ 03 февраля 2011
  1. Вам нужно объявить проверенные исключения, которые выдает ваш метод.
  2. Если вы объявляете 'throws Exception', которое в значительной степени покрывает большинство, если не все отмеченные исключения
  3. Вы всегда можете выбросить непроверенное исключение во время выполнения и не должны объявлять.1008 * Я совершенно уверен, что если вы попытаетесь сгенерировать проверенное исключение и не объявили метод как сгенерирующий этот тип, код даже не скомпилируется (проверяется сейчас).

    РЕДАКТИРОВАТЬ, верно, если вы попробуете что-топросто как

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

    вы получите ошибку компиляции.

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

3 голосов
/ 23 июня 2018

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

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

В основном это в основном метод, так что пользователю не нужно исследовать внутри метода.

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

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

2 голосов
/ 25 июня 2018

Ключевое слово Java throws,

  • Java throws ключевое слово используется для объявления исключения.
  • throws сопровождается классом.
  • Проверенное исключение можно распространить с помощью throws.
  • Предоставляет информацию вызывающей стороне метода об исключении.

throws пример,

void m()throws ArithmeticException{  
    //method code  
}  
...