В този урок ще се научим да използваме ключовата дума throw и throws за обработка на изключения с помощта на примери.
В Java изключенията могат да бъдат категоризирани в два типа:
- Без отметка Изключения: Те не са проверени по време на компилация, но в навечерието time.For пример:
ArithmeticException
,NullPointerException
,ArrayIndexOutOfBoundsException
, изключения приError
клас и т.н. - Проверени изключения: Те се проверяват по време на компилация. Например
IOException
,InterruptedException
и т.н.
Обърнете се към Java Exceptions, за да научите подробно за проверени и непроверени изключения.
Обикновено не е необходимо да обработваме непроверени изключения. Това е така, защото възникват непроверени изключения поради грешки в програмирането. И е добра практика да ги коригирате, вместо да ги боравите.
Този урок сега ще се съсредоточи върху това как да се справя с проверените изключения, използвайки 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 Java
В throw
ключовата дума се използва, за да се хвърлят изрично нито едно изключение.
Когато се хвърли изключение, потокът от изпълнение на програмата се прехвърля от try
блока в catch
блока. Използваме throw
ключовата дума в даден метод.
Синтаксисът му е:
throw throwableObject;
Хвърлимият обект е екземпляр на клас Throwable
или подклас на Throwable
класа.
Пример 2: Ключова дума Java
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
се изпълняват оператори в блока.