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

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

6 ответов


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

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

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

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


если метод объявлен с ключевым словом 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);
}

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

предположим, что метод библиотеки использует этот трюк, чтобы разрешить реализацию 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
    }
}

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

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

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

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

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

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


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

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

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

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

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


Java бросает ключевое слово,

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

throws например,

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