Er zijn veel verschillende concepten om te leren bij het leren van een programmeertaal. Veel van deze concepten zijn als grammatica in gesproken talen - ze houden het gestructureerd en functioneren naar behoren. Afhandeling van uitzonderingen in Java is een belangrijke vaardigheid om een goede Java-programmeur te worden.
Uitzonderingen worden gegenereerd wanneer het programma een fout is tegengekomen. Zodra de uitzondering is gegenereerd, is het aan de programmeur om te beslissen wat er vervolgens gebeurt. De meest voorkomende en de slechtste afhandeling van een uitzondering negeert het stilzwijgend. Het afdrukken van stapelsporen naar de console moet op zijn minst worden gedaan, zodat het lokaliseren van een fout eenvoudiger is.
Gecontroleerd versus niet-gecontroleerde uitzonderingen
Gecontroleerde uitzonderingen zijn klassen waarvan is afgeleid Uitzondering
klasse en worden gegenereerd wanneer het programma de uitzondering kan herstellen en ze moeten worden betrapt met behulp van een van de proberen
blokken of rethrown. Niet-gecontroleerde uitzonderingen zijn klassen waarvan is afgeleid RuntimeException
en worden gegooid wanneer het programma niet van de uitzondering kan herstellen en ze niet hoeven te worden betrapt of opnieuw worden gegooid. Over het algemeen zijn niet-gecontroleerde uitzonderingen het gevolg van een programmeerfout en kunnen worden voorkomen (bijvoorbeeld controleren of een variabele nul is om te voorkomen dat NullPointerException
).
Omdat ongecontroleerde uitzonderingen schonere code produceren, geven programmeurs er de voorkeur aan boven gecontroleerde uitzonderingen en tegenwoordig komt het in feite neer op een persoonlijke keuze. Uitzonderingen in de Java API houden echter rekening met het verschil.
gecontroleerd | ongehinderd |
---|---|
IOException | NullPointerException |
ClassNotFoundException | IllegalArgumentException |
InterruptedException | IllegalStateException |
Methode één van de twee:
Try-Catch gebruiken - Eindelijk
- 1 Maak een klasse en de belangrijkste methode. Maak een klasse en noem deze zoals je wilt en maak in de klas de hoofdmethode.
openbaar klasse HandleExceptionExample openbaar statisch leegte hoofd(Draad[] args)
- 2 Verklaar drie primitieve integer-variabelen en voer een deling uit. Verklaar drie
int
(primitief geheel getal) variabelen en noem zedividend
,deler
enquotiënt
. Wijs een willekeurig nummer toe aandividend
variabele, wijs nul toe aandeler
variabele en toekennen quotiënt vandividend
endeler
naarquotiënt
variabel. Afdrukkenquotiënt
variabel voor de console.openbaar klasse HandleExceptionExample openbaar statisch leegte hoofd(Draad[] args) int dividend = 50; int deler = 0; int quotiënt = dividend / deler; Systeem.uit.println(quotiënt);
- 3 Compileer en voer het programma uit. Programma drukt exception stack trace naar de console af en beëindigt de uitvoering op de regel waar de
quotiënt
variabele krijgt een waarde toegewezen.Quotiënt
variabele zal nooit worden afgedrukt naar de console omdat niet-afgevangen uitzonderingen, op de regel waarop ze werden gegooid, uit de methode breken.Uitzondering in draad "hoofd" Java.LANG.ArithmeticException: / met nul bij HandleExceptionExample.hoofd(HandleExceptionExample.Java:5) in de zon.reflecteren.NativeMethodAccessorImpl.invoke0(inheems Methode) in de zon.reflecteren.NativeMethodAccessorImpl.beroep doen op(NativeMethodAccessorImpl.Java:62) in de zon.reflecteren.DelegatingMethodAccessorImpl.beroep doen op(DelegatingMethodAccessorImpl.Java:43) in java.LANG.reflecteren.Methode.beroep doen op(Methode.Java:498) bij com.IntelliJ.rt.executie.toepassing.AppMain.hoofd(AppMain.Java:147)
- 4 Vang en hanteer uitzondering. Wijs een getal nul toe aan de
quotiënt
variabele en maak een try-catch-blok metArithmeticException
in devangst
uitspraak. Binnen in deproberen
blokkeren, delendividend
endeler
variabelen en wijs hun quotiënt toe aan dequotiënt
variabel. Binnen in devangst
blokkeer, druk de exception stack trace naar de console af. Na het try-catch-blok, druk dequotiënt
variabel voor de console.openbaar klasse HandleExceptionExample openbaar statisch leegte hoofd(Draad[] args) int dividend = 50; int deler = 0; int quotiënt = 0; proberen quotiënt = dividend / deler; vangst (ArithmeticException e) e.printStackTrace(); Systeem.uit.println(quotiënt);
- 5 Compileer en voer het programma uit. Programma drukt exception stack trace naar de console af, maar beëindigt de uitvoering niet op de regel waar de
quotiënt
variabele krijgt een waarde toegewezen.Quotiënt
variabele wordt ook afgedrukt naar de console, maar vóór de uitzondering.0 Java.LANG.ArithmeticException: / met nul bij HandleExceptionExample.hoofd(HandleExceptionExample.Java:7) in de zon.reflecteren.NativeMethodAccessorImpl.invoke0(inheems Methode) in de zon.reflecteren.NativeMethodAccessorImpl.beroep doen op(NativeMethodAccessorImpl.Java:62) in de zon.reflecteren.DelegatingMethodAccessorImpl.beroep doen op(DelegatingMethodAccessorImpl.Java:43) in java.LANG.reflecteren.Methode.beroep doen op(Methode.Java:498) bij com.IntelliJ.rt.executie.toepassing.AppMain.hoofd(AppMain.Java:147)
- 6 Toevoegen
Tenslotte
blok.Tenslotte
blokken worden altijd uitgevoerd na deproberen
en / ofvangst
blokken en ze worden meestal gebruikt om de middelen vrij te maken. In plaats van na het try-catch-finally-blok, druk dequotiënt
variabel voor de console in deTenslotte
blok.openbaar klasse HandleExceptionExample openbaar statisch leegte hoofd(Draad[] args) int dividend = 50; int deler = 0; int quotiënt = 0; proberen quotiënt = dividend / deler; vangst (ArithmeticException e) e.printStackTrace(); Tenslotte Systeem.uit.println(quotiënt);
- 7 Compileer en voer het programma uit. Het programma drukt een exception stack-trace af en
quotiënt
variabele direct erna, naar de console.Java.LANG.ArithmeticException: / met nul bij HandleExceptionExample.hoofd(HandleExceptionExample.Java:11) in de zon.reflecteren.NativeMethodAccessorImpl.invoke0(inheems Methode) in de zon.reflecteren.NativeMethodAccessorImpl.beroep doen op(NativeMethodAccessorImpl.Java:62) in de zon.reflecteren.DelegatingMethodAccessorImpl.beroep doen op(DelegatingMethodAccessorImpl.Java:43) in java.LANG.reflecteren.Methode.beroep doen op(Methode.Java:498) bij com.IntelliJ.rt.executie.toepassing.AppMain.hoofd(AppMain.Java:147) 0
Methode twee van twee:
Try-With-Resources gebruiken
- 1 Maak een klasse en de belangrijkste methode. Maak een klasse en noem deze zoals je wilt en maak in de klas de hoofdmethode.
openbaar klasse HandleExceptionExample openbaar statisch leegte hoofd(Draad[] args)
- 2 Maak try-catch-blok. Maak een try-catch-blok en voeg haakjes toe aan de
proberen
uitspraak.openbaar klasse HandleExceptionExample openbaar statisch leegte hoofd(Draad[] args) proberen () vangst ()
- 3 Bron toevoegen aan de
proberen
en uitzondering op devangst
uitspraak. Een exemplaarFileReader
enhet dossier
als zijn parameter in deproberen
uitspraak. In devangst
verklaring, toevoegenIOException
en binnen in het blok, traceer de stapel naar de console.openbaar klasse HandleExceptionExample openbaar statisch leegte hoofd(Draad[] args) proberen (FileReader lezer = nieuwe FileReader(nieuwe het dossier("bestandsnaam"))) // code weggelaten vangst (IOException e) e.printStackTrace();
- 4 Afgewerkt. Door try-with-resources te gebruiken, worden de bronnen automatisch vrijgegeven aan het besturingssysteem. Zie het als een automatisch
Tenslotte
blok. Als er een uitzondering wordt gegenereerd tijdens het lezen van het bestand,reader.close ()
wordt automatisch gebeld.- Het equivalent van try-catch-finally:
FileReader lezer = nul; proberen lezer = nieuwe FileReader(nieuwe het dossier("bestandsnaam")); // code weggelaten vangst (IOException e) e.printStackTrace(); Tenslotte als (lezer != nul) proberen lezer.dichtbij(); vangst (IOException e) e.printStackTrace();
- Het equivalent van try-catch-finally: