В этом руководстве мы научимся использовать ключевое слово throw и throws для обработки исключений с помощью примеров.
В Java исключения можно разделить на два типа:
- Unchecked Исключение: Они не проверяются во время компиляции , но при обкатке time.for например:
ArithmeticException
,NullPointerException
,ArrayIndexOutOfBoundsException
, исключений поError
классу, и т.д. - Проверенные исключения: они проверяются во время компиляции. Так , например,
IOException
,InterruptedException
и т.д.
Обратитесь к Исключениям Java, чтобы подробно узнать о отмеченных и непроверенных исключениях.
Обычно нам не нужно обрабатывать непроверенные исключения. Это потому, что непроверенные исключения возникают из-за ошибок программирования. И рекомендуется исправлять их, а не обрабатывать их.
В этом руководстве мы сосредоточимся на том, как обрабатывать проверенные исключения с помощью throw
и throws
.
Java бросает ключевое слово
Мы используем throws
ключевое слово в объявлении метода, чтобы объявить тип исключений, которые могут возникнуть в нем.
Его синтаксис:
accessModifier returnType methodName() throws ExceptionType1, ExceptionType2… ( // code )
Как видно из синтаксиса выше, мы можем использовать throws
для объявления нескольких исключений.
Пример 1: Java выдает ключевое слово
import java.io.*; class Main ( public static void findFile() throws IOException ( // code that may produce IOException File newFile=new File("test.txt"); FileInputStream stream=new FileInputStream(newFile); ) public static void main(String() args) ( try( findFile(); ) catch(IOException e)( System.out.println(e); ) ) )
Вывод
java.io.FileNotFoundException: test.txt (нет такого файла или каталога)
Когда мы запускаем эту программу, если файл test.txt
не существует, FileInputStream
выдает a, FileNotFoundException
который расширяет IOException
класс.
Если метод не обрабатывает исключения, тип исключений, которые могут возникнуть внутри него, должен быть указан в throws
предложении, чтобы методы, расположенные дальше в стеке вызовов, могли их обрабатывать или определять их с помощью самого throws
ключевого слова.
findFile()
Метод определяет , что IOException
может быть выброшен. main()
Метод вызывает этот метод и обрабатывает исключение , если она брошена.
Выбрасывание нескольких исключений
Вот как мы можем создать несколько исключений, используя throws
ключевое слово.
import java.io.*; class Main ( public static void findFile() throws NullPointerException, IOException, InvalidClassException ( // code that may produce NullPointerException… … … // code that may produce IOException… … … // code that may produce InvalidClassException… … … ) public static void main(String() args) ( try( findFile(); ) catch(IOException e1)( System.out.println(e1.getMessage()); ) catch(InvalidClassException e2)( System.out.println(e2.getMessage()); ) ) )
Здесь findFile()
метод определяет , что он может бросить NullPointerException
, IOException
и InvalidClassException
в своей throws
статье.
Обратите внимание, что мы не обрабатывали NullPointerException
. Это потому, что это непроверенное исключение. Нет необходимости указывать это в throws
предложении и обрабатывать его.
выбрасывает ключевое слово Vs. попробуй … поймай … наконец
Может быть несколько методов, которые могут вызывать исключения. Написание try… catch
для каждого метода будет утомительным, а код станет длинным и менее читаемым.
throws
также полезно, когда вы проверили исключение (исключение, которое необходимо обработать), которое вы не хотите перехватывать в вашем текущем методе.
Ключевое слово Java throw
throw
Используется ключевое слово явно бросить один исключение.
При возникновении исключения поток выполнения программы переходит от try
блока к catch
блоку. Мы используем throw
ключевое слово внутри метода.
Его синтаксис:
throw throwableObject;
Выбрасываемый объект - это экземпляр класса Throwable
или подкласса Throwable
класса.
Пример 2: ключевое слово Java throw
class Main ( public static void divideByZero() ( throw new ArithmeticException("Trying to divide by 0"); ) public static void main(String() args) ( divideByZero(); ) )
Вывод
Исключение в потоке «main» java.lang.ArithmeticException: попытка разделить на 0 в Main.divideByZero (Main.java:3) в Main.main (Main.java:7) статус выхода 1
В этом примере мы явно бросаем ArithmeticException.
Примечание: ArithmeticException
это непроверенное исключение. Обычно нет необходимости обрабатывать непроверенные исключения.
Пример 3: выбрасывание проверенного исключения
import java.io.*; class Main ( public static void findFile() throws IOException ( throw new IOException("File not found"); ) public static void main(String() args) ( try ( findFile(); System.out.println("Rest of code in try block"); ) catch (IOException e) ( System.out.println(e.getMessage()); ) ) )
Вывод
Файл не найден
findFile()
Метод бросает IOException
с сообщением мы передали в конструктор.
Обратите внимание: поскольку это проверенное исключение, мы должны указать его в throws
предложении.
Методы, вызывающие этот findFile()
метод, должны либо обработать это исключение, либо throws
сами указать его с помощью ключевого слова.
Мы обработали это исключение в main
()
методе. При возникновении исключения поток выполнения программы переходит от try
блока к catch
блоку. Таким образом, остальная часть кода в try
блоке пропускается, а операторы в catch
блоке выполняются.