I denne vejledning lærer vi at bruge kaste og kaste nøgleord til undtagelseshåndtering ved hjælp af eksempler.
I Java kan undtagelser kategoriseres i to typer:
- Ikke markeret Undtagelser: De er ikke kontrolleret ved compile-tid, men ved run-time.For eksempel:
ArithmeticException
,NullPointerException
,ArrayIndexOutOfBoundsException
, Undtagelserne iError
klassen, etc. - Kontrollerede undtagelser: De kontrolleres ved kompileringstidspunktet. For eksempel
IOException
,InterruptedException
etc.
Se Java-undtagelser for at lære mere om afkrydsede og ikke-markerede undtagelser.
Normalt behøver vi ikke håndtere ukontrollerede undtagelser. Det skyldes, at der ikke er markeret undtagelser på grund af programmeringsfejl. Og det er en god praksis at rette dem i stedet for at håndtere dem.
Denne vejledning vil nu fokusere på, hvordan man håndterer kontrollerede undtagelser ved hjælp af throw
og throws
.
Java kaster nøgleord
Vi bruger throws
nøgleordet i metodedeklarationen til at erklære den type undtagelser, der kan forekomme inden for det.
Dens syntaks er:
accessModifier returnType methodName() throws ExceptionType1, ExceptionType2… ( // code )
Som du kan se fra ovenstående syntaks, kan vi bruge throws
til at erklære flere undtagelser.
Eksempel 1: Java kaster Keyword
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); ) ) )
Produktion
java.io.FileNotFoundException: test.txt (Ingen sådan fil eller bibliotek)
Når vi kører dette program, hvis filen test.txt
ikke findes, FileInputStream
kaster en FileNotFoundException
som udvider IOException
klassen.
Hvis en metode ikke håndterer undtagelser, skal typen af undtagelser, der kan forekomme inden for den, specificeres i throws
klausulen, så metoder længere op i opkaldstakken kan håndtere dem eller specificere dem ved hjælp af throws
nøgleordet selv.
Den findFile()
metode angiver, at en IOException
kan kastes. Den main()
metode kalder denne metode og håndterer undtagelsen, hvis den kastes.
Kaster flere undtagelser
Her er hvordan vi kan kaste flere undtagelser ved hjælp af throws
nøgleordet.
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()); ) ) )
Her findFile()
metoden angiver, at det kan kaste NullPointerException
, IOException
og InvalidClassException
i sin throws
klausul.
Bemærk, at vi ikke har håndteret NullPointerException
. Dette er fordi det er en ukontrolleret undtagelse. Det er ikke nødvendigt at specificere det i throws
klausulen og håndtere det.
kaster nøgleord Vs. prøv … fang … endelig
Der kan være flere metoder, der kan forårsage undtagelser. Skrivning try… catch
til hver metode vil være kedelig, og koden bliver lang og mindre læselig.
throws
er også nyttigt, når du har markeret undtagelse (en undtagelse, der skal håndteres), som du ikke vil fange i din nuværende metode.
Java kaste nøgleord
Den throw
søgeord bruges til eksplicit at smide en enkelt undtagelse.
Når en undtagelse kastes, overføres strømmen af programudførelse fra try
blokken til catch
blokken. Vi bruger throw
nøgleordet inden for en metode.
Dens syntaks er:
throw throwableObject;
Et kastbart objekt er en forekomst af klasse Throwable
eller underklasse af Throwable
klassen.
Eksempel 2: Java-nøgleord
class Main ( public static void divideByZero() ( throw new ArithmeticException("Trying to divide by 0"); ) public static void main(String() args) ( divideByZero(); ) )
Produktion
Undtagelse i tråden "main" java.lang.ArithmeticException: Forsøger at dele med 0 ved Main.divideByZero (Main.java:3) ved Main.main (Main.java:7) exit status 1
I dette eksempel kaster vi eksplicit en ArithmeticException.
Bemærk: ArithmeticException
er en ikke-markeret undtagelse. Det er normalt ikke nødvendigt at håndtere ukontrollerede undtagelser.
Eksempel 3: Kaste markeret undtagelse
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()); ) ) )
Produktion
Fil ikke fundet
Den findFile()
metode kaster en IOException
med det budskab, vi passerede på sin konstruktør.
Bemærk, at da det er en markeret undtagelse, skal vi specificere det i throws
klausulen.
Metoderne, der kalder denne findFile()
metode, skal enten håndtere denne undtagelse eller specificere den ved hjælp af throws
nøgleordet selv.
Vi har håndteret denne undtagelse i main
()
metoden. Flowet af programudførelse overføres fra try
blokken til catch
blokken, når en undtagelse kastes. Så try
springes resten af koden i blokken over, og udsagn i catch
blokken udføres.