Gecontroleerde en ongecontroleerde uitzonderingen in Java

1. Overzicht

Java-uitzonderingen vallen in twee hoofdcategorieën: gecontroleerde uitzonderingen en niet-gecontroleerde uitzonderingen. In dit artikel geven we enkele codevoorbeelden over hoe u ze kunt gebruiken.

2. Gecontroleerde uitzonderingen

In het algemeen vertegenwoordigen aangevinkte uitzonderingen fouten die buiten de controle van het programma vallen. Bijvoorbeeld de constructor van FileInputStream gooit FileNotFoundException als het invoerbestand niet bestaat.

Java verifieert aangevinkte uitzonderingen tijdens het compileren.

Daarom moeten we de gooit trefwoord om een ​​aangevinkte uitzondering te declareren:

privé statische ongeldig checkExceptionWithThrows () gooit FileNotFoundException {File file = new File ("not_existing_file.txt"); FileInputStream-stream = nieuwe FileInputStream (bestand); }

We kunnen ook een proberen te vangen blok om een ​​aangevinkte uitzondering af te handelen:

privé statisch ongeldig gecontroleerdExceptionWithTryCatch () {Bestandsbestand = nieuw bestand ("not_existing_file.txt"); probeer {FileInputStream stream = nieuwe FileInputStream (bestand); } catch (FileNotFoundException e) {e.printStackTrace (); }}

Enkele veelvoorkomende gecontroleerde uitzonderingen in Java zijn IOException, SQLException, en ParseException.

De Uitzondering klasse is de superklasse van gecontroleerde uitzonderingen. Daarom kunnen we een aangepaste gecontroleerde uitzondering maken door uit te breiden Uitzondering:

openbare klasse IncorrectFileNameException breidt Uitzondering {openbaar IncorrectFileNameException (String errorMessage) {super (errorMessage) uit; }} 

3. Ongecontroleerde uitzonderingen

Als een programma een ongecontroleerde uitzondering genereert, weerspiegelt dit een fout in de programmalogica. Als we een getal bijvoorbeeld delen door 0, gooit Java ArithmeticException:

privé statische leegte divideByZero () {int teller = 1; int noemer = 0; int resultaat = teller / noemer; } 

Java controleert geen ongecontroleerde uitzonderingen tijdens het compileren. Verder hoeven we geen ongecontroleerde uitzonderingen te declareren in een methode met de gooit trefwoord. En hoewel de bovenstaande code geen fouten bevat tijdens het compileren, zal het gooien ArithmeticException tijdens runtime.

Enkele veelvoorkomende ongecontroleerde uitzonderingen in Java zijn NullPointerException, ArrayIndexOutOfBoundsException, en IllegalArgumentException.

De RuntimeException klasse is de superklasse van alle ongecontroleerde uitzonderingen. Daarom kunnen we een aangepaste ongecontroleerde uitzondering maken door uit te breiden RuntimeException:

openbare klasse NullOrEmptyException breidt RuntimeException uit {openbare NullOrEmptyException (String errorMessage) {super (errorMessage); }}

4. Wanneer aangevinkte uitzonderingen en ongecontroleerde uitzonderingen gebruiken

Het is een goede gewoonte om uitzonderingen in Java te gebruiken, zodat we foutafhandelingscode kunnen scheiden van gewone code. We moeten echter beslissen welk type uitzondering moet worden gegenereerd. De Oracle Java-documentatie biedt richtlijnen voor het gebruik van aangevinkte uitzonderingen en niet-aangevinkte uitzonderingen:

“Als redelijkerwijs kan worden verwacht dat een cliënt herstelt van een uitzondering, maak er dan een aangevinkte uitzondering van. Als een klant niets kan doen om van de uitzondering te herstellen, maak er dan een ongecontroleerde uitzondering van. "

Voordat we een bestand openen, kunnen we bijvoorbeeld eerst de naam van het invoerbestand valideren. Als de bestandsnaam van de gebruikersinvoer ongeldig is, kunnen we een aangepaste gecontroleerde uitzondering genereren:

if (! isCorrectFileName (bestandsnaam)) {gooi nieuwe IncorrectFileNameException ("Onjuiste bestandsnaam:" + bestandsnaam); } 

Op deze manier kunnen we het systeem herstellen door een andere gebruikersinvoerbestandsnaam te accepteren. Als de naam van het invoerbestand echter een null-pointer is of een lege tekenreeks, betekent dit dat er enkele fouten in de code zitten. In dit geval zouden we een ongecontroleerde uitzondering moeten genereren:

if (fileName == null || fileName.isEmpty ()) {throw new NullOrEmptyException ("De bestandsnaam is null of leeg."); } 

5. Conclusie

In dit artikel hebben we het verschil tussen aangevinkte en niet-aangevinkte uitzonderingen besproken. We hebben ook enkele codevoorbeelden gegeven om te laten zien wanneer u aangevinkte of niet-aangevinkte uitzonderingen moet gebruiken.

Zoals altijd is alle code in dit artikel te vinden op GitHub.