In deze tutorial leren we aan de hand van voorbeelden de instructie try catch in Java kennen.
Het try… catch
blok in Java wordt gebruikt om uitzonderingen af te handelen en voorkomt de abnormale beëindiging van het programma.
Hier is de syntaxis van een try… catch
blok in Java.
try( // code ) catch(exception) ( // code )
Het try
blok bevat de code die een uitzondering kan genereren.
Het catch
blok bevat de code die wordt uitgevoerd wanneer er een uitzondering optreedt binnen het try
blok.
Voorbeeld: Java try… catch block
class Main ( public static void main(String() args) ( try ( int divideByZero = 5 / 0; System.out.println("Rest of code in try block"); ) catch (ArithmeticException e) ( System.out.println("ArithmeticException => " + e.getMessage()); ) ) )
Uitvoer
ArithmeticException => / bij nul
Let in het bovenstaande voorbeeld op de regel,
int divideByZero = 5 / 0;
Hier proberen we een getal door nul te delen . In dit geval treedt er een uitzondering op. Daarom hebben we deze code in het try
blok ingesloten .
Wanneer het programma deze code tegenkomt, ArithmeticException
treedt op. En de uitzondering wordt opgevangen door het catch
blok en voert de code binnen het catch
blok uit.
Het catch
blok wordt alleen uitgevoerd als er een uitzondering in het try
blok bestaat.
Opmerking : in Java kunnen we een try
blok zonder catch
blok gebruiken. We kunnen echter geen catch
blok zonder try
blok gebruiken.
Java probeer … eindelijk te blokkeren
We kunnen het try
blok ook samen met een eindblok gebruiken.
In dit geval wordt het final-blok altijd uitgevoerd, ongeacht of er een uitzondering in het try-blok zit of niet.
Voorbeeld: Java probeer … eindelijk te blokkeren
class Main ( public static void main(String() args) ( try ( int divideByZero = 5 / 0; ) finally ( System.out.println("Finally block is always executed"); ) ) )
Uitvoer
Tenslotte wordt blok altijd uitgevoerd Uitzondering in thread "main" java.lang.ArithmeticException: / door nul op Main.main (Main.java:4)
In het bovenstaande voorbeeld hebben we het try
blok samen met het finally
blok gebruikt. We kunnen zien dat de code in het try
blok een uitzondering veroorzaakt.
De code in het finally
blok wordt echter ongeacht de uitzondering uitgevoerd.
Java probeer … vangen … eindelijk blokkeren
In Java kunnen we ook het laatste blok na het try… catch
blok gebruiken. Bijvoorbeeld,
import java.io.*; class ListOfNumbers ( // create an integer array private int() list = (5, 6, 8, 9, 2); // method to write data from array to a fila public void writeList() ( PrintWriter out = null; try ( System.out.println("Entering try statement"); // creating a new file OutputFile.txt out = new PrintWriter(new FileWriter("OutputFile.txt")); // writing values from list array to Output.txt for (int i = 0; i <7; i++) ( out.println("Value at: " + i + " = " + list(i)); ) ) catch (Exception e) ( System.out.println("Exception => " + e.getMessage()); ) finally ( // checking if PrintWriter has been opened if (out != null) ( System.out.println("Closing PrintWriter"); // close PrintWriter out.close(); ) else ( System.out.println("PrintWriter not open"); ) ) ) ) class Main ( public static void main(String() args) ( ListOfNumbers list = new ListOfNumbers(); list.writeList(); ) )
Uitvoer
Try-instructie Exception invoeren => Index 5 buiten bereik voor lengte 5 Afsluiten van PrintWriter
In het bovenstaande voorbeeld hebben we een array gemaakt met de naam list en een bestand met de naam output.txt. Hier proberen we gegevens uit de array te lezen en op te slaan in het bestand.
Let op de code,
for (int i = 0; i < 7; i++) ( out.println("Value at: " + i + " = " + list(i)); )
Hier is de grootte van de array 5
en het laatste element van de array is list(4)
. We proberen echter toegang te krijgen tot elementen op a(5)
en a(6)
.
Daarom genereert de code een uitzondering die wordt opgevangen door het catch-blok.
Omdat het finally
blok altijd wordt uitgevoerd, hebben we code toegevoegd om de PrintWriter
binnenkant van het slotblok te sluiten .
Het is een goede gewoonte om tenslotte block te gebruiken om belangrijke opschoningscode op te nemen, zoals het sluiten van een bestand of verbinding.
Opmerking : er zijn enkele gevallen waarin een finally
blok niet wordt uitgevoerd:
- Gebruik van
System.exit()
methode - Er treedt een uitzondering op in het
finally
blok - De dood van een draad
Meerdere Catch-blokken
Voor elk try
blok kunnen er nul of meer catch
blokken zijn. Met meerdere catch
blokken kunnen we elke uitzondering anders behandelen.
Het argumenttype van elk catch
blok geeft het type uitzondering aan dat ermee kan worden afgehandeld. Bijvoorbeeld,
class ListOfNumbers ( public int() arr = new int(10); public void writeList() ( try ( arr(10) = 11; ) catch (NumberFormatException e1) ( System.out.println("NumberFormatException => " + e1.getMessage()); ) catch (IndexOutOfBoundsException e2) ( System.out.println("IndexOutOfBoundsException => " + e2.getMessage()); ) ) ) class Main ( public static void main(String() args) ( ListOfNumbers list = new ListOfNumbers(); list.writeList(); ) )
Uitvoer
IndexOutOfBoundsException => Index 10 buiten bereik voor lengte 10
In dit voorbeeld hebben we een array met gehele getallen gemaakt met de naam arr
grootte 10 .
Omdat de array-index begint bij 0 , staat het laatste element van de array op arr(9)
. Let op de verklaring,
arr(10) = 11;
Hier proberen we een waarde toe te kennen aan de index 10 . Vandaar dat het IndexOutOfBoundException
voorkomt.
Als er een uitzondering optreedt in het try
blok,
- De uitzondering wordt naar het eerste
catch
blok geworpen . Het eerstecatch
blok behandelt geen anIndexOutOfBoundsException
, dus het wordt doorgegeven aan het volgendecatch
blok. - Het tweede
catch
blok in het bovenstaande voorbeeld is de juiste uitzonderingshandler omdat het eenIndexOutOfBoundsException
. Daarom wordt het uitgevoerd.
Meerdere uitzonderingen opvangen
Vanaf Java SE 7 en hoger kunnen we nu meer dan één type uitzondering opvangen met één catch
blok.
Dit vermindert codeduplicatie en verhoogt de eenvoud en efficiëntie van de code.
Elk uitzonderingstype dat door het catch
blok kan worden afgehandeld , wordt gescheiden door middel van een verticale balk |
.
De syntaxis is:
try ( // code ) catch (ExceptionType1 | Exceptiontype2 ex) ( // catch block )
Ga voor meer informatie naar Java dat meerdere uitzonderingen opvangt.
Java-instructie voor try-with-resources
De instructie try-with-resources is een instructie try met een of meer resource-declaraties.
De syntaxis is:
try (resource declaration) ( // use of the resource ) catch (ExceptionType e1) ( // catch block )
De bron is een object dat aan het einde van het programma moet worden gesloten. Het moet worden gedeclareerd en geïnitialiseerd in de instructie try.
Laten we een voorbeeld nemen.
try (PrintWriter out = new PrintWriter(new FileWriter("OutputFile.txt")) ( // use of the resource )
De instructie try-with-resources wordt ook wel automatisch resourcebeheer genoemd . Deze instructie sluit automatisch alle bronnen aan het einde van de instructie.
Ga voor meer informatie naar de java-instructie try-with-resources.