Я вызываю метод, который генерирует исключения, но мне не нужно помещать этот метод в блок try catch в static void main (String args []), даже если в этом руководстве говорится, что я должен получить ошибку. Почему это? Ниже мой код и ссылка на учебник. Я поиграл со вторым примером в уроке.

https://beginnersbook.com/2013/04/java-throws/?unapproved=133049&moderation-hash=486e9de11daa2c67068e84cdacd88794#comment-133049

public class Sample2 {

    static void myMethod() throws ArithmeticException, NullPointerException {

        System.out.println("myMethod has been successfully called");

        throw new ArithmeticException("Arithmetic Expression has been thrown");
    }

    public static void main(String args[]) { 
        myMethod();
    }
}
0
Peter G. Williams 24 Май 2019 в 19:09

2 ответа

Лучший ответ

Когда речь идет о исключениях в Java , используются только 2 основных типа: проверенные исключения и непроверенные исключения .

проверенные исключения проверяются во время компиляции: если вы не обработали проверенное исключение (например, с помощью блока try / catch или ключевого слова throws), компилятор выдаст ошибку, другими словами, он не позволит вам собрать вашу программу, поэтому вы всегда должны обрабатывать все проверенные исключения.

непроверенные исключения проверяются во время выполнения: ваш компилятор не выдаст ошибку, если вы не обработаете исключения такого типа.

Теперь вопрос: как я могу различить эти два типа, когда я пишу код?

Прежде всего следует помнить, что каждое исключение в java должно наследоваться от класса «Exception» .

Теперь есть простой способ отличить непроверенное исключение от проверенного: любой класс исключений, который наследуется от «RuntimeException» , считается непроверенное исключение и любой класс, унаследованный от «Исключение» , но не «RuntimeException» считается проверенным исключением .

В вашем случае , метод, который вы вызываете, выдает ArithmeticException и NullPointerException. Но эти два исключения наследуются от «RuntimeException» . Итак, согласно правилу, написанному выше, эти 2 исключения являются непроверенными исключениями , и поэтому вам не нужно было их обрабатывать при вызове метода myMethod().

2
El-MAHMOUDI 24 Май 2019 в 16:59

В учебнике есть небольшая ошибка: хотя в нем четко указано, что существует один вид исключений, которые не нужно перехватывать, он не замечает, что исключения, выданные в их собственных примерах, являются непроверенными , т.е. Runtime разнообразие:

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

Замените ArithmeticException исключением, которое вы получили непосредственно из Exception, чтобы увидеть ошибку.

4
dasblinkenlight 24 Май 2019 в 16:14