Kontrollerede og ikke-markerede undtagelser i Java

1. Oversigt

Java-undtagelser falder i to hovedkategorier: kontrollerede undtagelser og ikke-markerede undtagelser. I denne artikel giver vi nogle kodeeksempler om, hvordan du bruger dem.

2. Kontrollerede undtagelser

Generelt repræsenterer afkrydsede undtagelser fejl uden for programmets kontrol. For eksempel konstruktøren af FileInputStream kaster FileNotFoundException hvis inputfilen ikke findes.

Java verificerer kontrollerede undtagelser på kompileringstidspunktet.

Derfor skal vi bruge kaster nøgleord til at erklære en markeret undtagelse:

privat statisk ugyldig kontrolleretExceptionWithThrows () kaster FileNotFoundException {File file = new File ("not_existing_file.txt"); FileInputStream stream = ny FileInputStream (fil); }

Vi kan også bruge en prøve-fangst blok for at håndtere en kontrolleret undtagelse:

privat statisk ugyldig kontrolleretExceptionWithTryCatch () {File file = new File ("not_existing_file.txt"); prøv {FileInputStream stream = ny FileInputStream (fil); } fange (FileNotFoundException e) {e.printStackTrace (); }}

Nogle almindelige kontrollerede undtagelser i Java er IOUndtagelse, SQLExceptionog ParseException.

Det Undtagelse klasse er superklassen af ​​kontrollerede undtagelser. Derfor kan vi oprette en brugerdefineret kontrolleret undtagelse ved at udvide Undtagelse:

offentlig klasse IncorrectFileNameException udvider Undtagelse {public IncorrectFileNameException (String errorMessage) {super (errorMessage); }} 

3. Ikke-markerede undtagelser

Hvis et program kaster en ikke-markeret undtagelse, afspejler det en fejl inde i programlogikken. For eksempel, hvis vi deler et tal med 0, kaster Java Aritmetisk undtagelse:

privat statisk ugyldigt divideByZero () {int-tæller = 1; int-nævneren = 0; int resultat = tæller / nævneren; } 

Java verificerer ikke ukontrollerede undtagelser på kompileringstidspunktet. Desuden behøver vi ikke erklære ukontrollerede undtagelser i en metode med kaster nøgleord. Og selvom ovenstående kode ikke har nogen fejl under kompileringstid, vil den kaste Aritmetisk undtagelse ved kørselstid.

Nogle almindelige ikke-markerede undtagelser i Java er NullPointerException, ArrayIndexOutOfBoundsExceptionog IllegalArgumentException.

Det RuntimeException klasse er superklassen af ​​alle ukontrollerede undtagelser. Derfor kan vi oprette en brugerdefineret ikke-markeret undtagelse ved at udvide RuntimeException:

offentlig klasse NullOrEmptyException udvider RuntimeException {public NullOrEmptyException (String errorMessage) {super (errorMessage); }}

4. Hvornår skal du bruge kontrollerede undtagelser og ikke-markerede undtagelser?

Det er en god praksis at bruge undtagelser i Java, så vi kan adskille fejlhåndteringskode fra almindelig kode. Vi skal dog beslutte, hvilken type undtagelse vi skal kaste. Oracle Java-dokumentationen giver vejledning om, hvornår man skal bruge kontrollerede undtagelser og ikke-markerede undtagelser:

”Hvis en klient med rimelighed kan forventes at komme sig fra en undtagelse, skal du gøre det til en kontrolleret undtagelse. Hvis en klient ikke kan gøre noget for at komme sig fra undtagelsen, skal du gøre det til en ukontrolleret undtagelse. ”

For eksempel, inden vi åbner en fil, kan vi først validere inputfilens navn. Hvis brugerinputfilens navn er ugyldigt, kan vi kaste en brugerdefineret kontrolleret undtagelse:

if (! isCorrectFileName (fileName)) {throw new IncorrectFileNameException ("Forkert filnavn:" + filnavn); } 

På denne måde kan vi gendanne systemet ved at acceptere et andet brugerinputfilnavn. Men hvis inputfilnavnet er en nul pointer, eller det er en tom streng, betyder det, at vi har nogle fejl i koden. I dette tilfælde skal vi kaste en ukontrolleret undtagelse:

if (fileName == null || fileName.isEmpty ()) {throw new NullOrEmptyException ("Filnavnet er null eller tomt."); } 

5. Konklusion

I denne artikel diskuterede vi forskellen mellem kontrollerede og ukontrollerede undtagelser. Vi leverede også nogle kodeeksempler for at vise, hvornår man skal bruge markerede eller ikke-markerede undtagelser.

Som altid kan al kode, der findes i denne artikel, findes på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found