In deze zelfstudie leren we met behulp van voorbeelden het throw en throw-trefwoord te gebruiken voor het afhandelen van uitzonderingen.
In Java kunnen uitzonderingen worden onderverdeeld in twee typen:
- Ongecontroleerde Uitzonderingen: Ze zijn niet gecontroleerd tijdens het compileren, maar op run-time.For voorbeeld:
ArithmeticException
,NullPointerException
,ArrayIndexOutOfBoundsException
, uitzonderingen onderError
klasse, etc. - Gecontroleerde uitzonderingen: ze worden gecontroleerd tijdens het compileren. Bijvoorbeeld
IOException
,InterruptedException
etc.
Raadpleeg Java-uitzonderingen voor meer informatie over aangevinkte en niet-aangevinkte uitzonderingen.
Meestal hoeven we geen ongecontroleerde uitzonderingen af te handelen. Het is omdat ongecontroleerde uitzonderingen optreden als gevolg van programmeerfouten. En het is een goede gewoonte om ze te corrigeren in plaats van ze af te handelen.
Deze tutorial zal zich nu concentreren op het omgaan met aangevinkte uitzonderingen met throw
en throws
.
Java gooit trefwoord
We gebruiken het throws
sleutelwoord in de methode-declaratie om het type uitzonderingen aan te geven dat erin kan voorkomen.
De syntaxis is:
accessModifier returnType methodName() throws ExceptionType1, ExceptionType2… ( // code )
Zoals u kunt zien aan de hand van de bovenstaande syntaxis, kunnen we gebruiken throws
om meerdere uitzonderingen te declareren.
Voorbeeld 1: Java gooit trefwoord
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); ) ) )
Uitvoer
java.io.FileNotFoundException: test.txt (bestand of map bestaat niet)
Als we dit programma draaien, en als het bestand test.txt
niet bestaat, FileInputStream
gooit het een FileNotFoundException
die de IOException
klasse uitbreidt .
Als een methode geen uitzonderingen afhandelt, moet het type uitzonderingen dat erin kan voorkomen in de throws
clausule worden gespecificeerd , zodat methoden verderop in de aanroepstapel ze kunnen afhandelen of ze kunnen specificeren met behulp van het throws
trefwoord zelf.
De findFile()
methode specificeert dat een IOException
kan worden gegooid. De main()
methode roept deze methode aan en behandelt de uitzondering als deze wordt gegenereerd.
Meerdere uitzonderingen gooien
Hier is hoe we meerdere uitzonderingen kunnen genereren met behulp van het throws
trefwoord.
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()); ) ) )
Hier, de findFile()
methode vermeld dat het kan gooien NullPointerException
, IOException
en InvalidClassException
in zijn throws
artikel.
Merk op dat we het NullPointerException
. Dit komt omdat het een ongecontroleerde uitzondering is. Het is niet nodig om het in de throws
clausule te specificeren en af te handelen.
gooit trefwoord Vs. probeer … vang … eindelijk
Er kunnen verschillende methoden zijn die uitzonderingen kunnen veroorzaken. Het schrijven try… catch
voor elke methode zal vervelend zijn en code wordt lang en minder leesbaar.
throws
is ook handig als u een uitzondering heeft aangevinkt (een uitzondering die moet worden afgehandeld) die u niet wilt opvangen in uw huidige methode.
Java throw-trefwoord
Het throw
sleutelwoord wordt gebruikt om expliciet een enkele uitzondering te genereren.
Wanneer er een uitzondering wordt gegenereerd, wordt de stroom van programma-uitvoering overgedragen van het try
blok naar het catch
blok. We gebruiken het throw
trefwoord binnen een methode.
De syntaxis is:
throw throwableObject;
Een werpbaar object is een instantie van een klasse Throwable
of subklasse van de Throwable
klasse.
Voorbeeld 2: Java-throw-trefwoord
class Main ( public static void divideByZero() ( throw new ArithmeticException("Trying to divide by 0"); ) public static void main(String() args) ( divideByZero(); ) )
Uitvoer
Uitzondering in thread "main" java.lang.ArithmeticException: Proberen te delen door 0 bij Main.divideByZero (Main.java:3) bij Main.main (Main.java:7) exit status 1
In dit voorbeeld gooien we expliciet een ArithmeticException.
Opmerking: dit ArithmeticException
is een ongecontroleerde uitzondering. Het is meestal niet nodig om ongecontroleerde uitzonderingen af te handelen.
Voorbeeld 3: Uitzondering aangevinkt
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()); ) ) )
Uitvoer
Bestand niet gevonden
De findFile()
methode gooit een IOException
met het bericht dat we aan de constructor hebben doorgegeven.
Merk op dat aangezien het een aangevinkte uitzondering is, we deze in de throws
clausule moeten specificeren .
De methoden die deze findFile()
methode aanroepen, moeten deze uitzondering afhandelen of deze throws
zelf specificeren met behulp van een trefwoord.
We hebben deze uitzondering in de main
()
methode afgehandeld . De stroom van programma-uitvoering wordt overgebracht van het try
blok naar het catch
blok wanneer er een uitzondering wordt gegenereerd. De rest van de code in het try
blok wordt dus overgeslagen en instructies in het catch
blok worden uitgevoerd.