I denne opplæringen vil vi lære å bruke kaste og kaste nøkkelord for unntakshåndtering ved hjelp av eksempler.
I Java kan unntak kategoriseres i to typer:
- Ukontrollert Unntak: De er ikke kontrollert ved kompilering-tiden, men på kjøre time.For eksempel:
ArithmeticException
,NullPointerException
,ArrayIndexOutOfBoundsException
, unntak i henholdError
klasse, etc. - Sjekket unntak: De sjekkes ved kompileringstid. For eksempel
IOException
,InterruptedException
etc.
Se Java-unntak for å lære mer om avmerkede og ukontrollerte unntak.
Vanligvis trenger vi ikke å håndtere ukontrollerte unntak. Det er fordi unchecked unntak oppstår på grunn av programmeringsfeil. Og det er god praksis å rette dem i stedet for å håndtere dem.
Denne opplæringen vil nå fokusere på hvordan du håndterer sjekket unntak ved hjelp av throw
og throws
.
Java kaster nøkkelord
Vi bruker throws
nøkkelordet i metodedeklarasjonen for å erklære hvilken type unntak som kan forekomme i det.
Dens syntaks er:
accessModifier returnType methodName() throws ExceptionType1, ExceptionType2… ( // code )
Som du kan se fra ovenstående syntaks, kan vi bruke throws
til å erklære flere unntak.
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); ) ) )
Produksjon
java.io.FileNotFoundException: test.txt (Ingen slik fil eller katalog)
Hvis filen test.txt
ikke eksisterer, FileInputStream
kaster vi et FileNotFoundException
som utvider IOException
klassen når vi kjører dette programmet .
Hvis en metode ikke håndterer unntak, må typen unntak som kan forekomme innenfor den spesifiseres i throws
paragrafen, slik at metoder lenger opp i samtalestakken kan håndtere dem eller spesifisere dem ved hjelp av throws
nøkkelordet selv.
Den findFile()
metode angir at en IOException
kan kastes. Den main()
metoden kaller denne metoden, og håndterer unntak hvis det blir kastet.
Kaster flere unntak
Slik kan vi kaste flere unntak ved å bruke throws
nøkkelordet.
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()
angir metoden som det kan kaste NullPointerException
, IOException
og InvalidClassException
i sin throws
klausul.
Merk at vi ikke har håndtert NullPointerException
. Dette er fordi det er et ukontrollert unntak. Det er ikke nødvendig å spesifisere det i throws
paragrafen og håndtere det.
kaster nøkkelordet vs. prøv … fang … endelig
Det kan være flere metoder som kan forårsake unntak. Å skrive try… catch
for hver metode vil være kjedelig og koden blir lang og mindre lesbar.
throws
er også nyttig når du har sjekket unntak (et unntak som må håndteres) som du ikke vil fange i din nåværende metode.
Java kaste nøkkelord
Den throw
nøkkelordet brukes til å eksplisitt kaste et eneste unntak.
Når et unntak blir kastet, overføres strømmen av programgjennomføring fra try
blokken til catch
blokken. Vi bruker throw
nøkkelordet innenfor en metode.
Dens syntaks er:
throw throwableObject;
Et kastbart objekt er en forekomst av klasse Throwable
eller underklasse av Throwable
klassen.
Eksempel 2: Java-kasteord
class Main ( public static void divideByZero() ( throw new ArithmeticException("Trying to divide by 0"); ) public static void main(String() args) ( divideByZero(); ) )
Produksjon
Unntak i tråden "main" java.lang.ArithmeticException: Prøver å dele med 0 ved Main.divideByZero (Main.java:3) ved Main.main (Main.java:7) exit status 1
I dette eksemplet kaster vi eksplisitt en ArithmeticException.
Merk: ArithmeticException
er et ukjent unntak. Det er vanligvis ikke nødvendig å håndtere ukontrollerte unntak.
Eksempel 3: Kaste avmerket unntak
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()); ) ) )
Produksjon
Fil ikke funnet
Den findFile()
metoden kaster en IOException
med meldingen vi passerte sin konstruktør.
Merk at siden det er et avkrysset unntak, må vi spesifisere det i throws
klausulen.
Metodene som kaller denne findFile()
metoden må enten håndtere dette unntaket eller spesifisere det ved hjelp av throws
nøkkelordet selv.
Vi har håndtert dette unntaket i main
()
metoden. Flyten av programkjøring overføres fra try
blokken til catch
blokken når et unntak kastes. Så, resten av koden i try
blokken hoppes over og utsagn i catch
blokken utføres.