I Java, undtagelse er en hændelse, der opstår under afviklingen af et program og forstyrrer det normale flow af programmets instruktioner. Bugs eller fejl, som vi ikke ønsker og begrænser vores programs normale udførelse af kode, omtales som undtagelser . I dette afsnit vil vi fokusere på typer af undtagelser i Java og forskellene mellem de to.
Undtagelser kan kategoriseres på to måder:
- Indbyggede undtagelser
- Afkrydset undtagelse
- Ikke markeret undtagelse
- Brugerdefinerede undtagelser
Indbygget undtagelse
Undtagelser der allerede er tilgængelige i Java biblioteker omtales som indbygget undtagelse . Disse undtagelser er i stand til at definere fejlsituationen, så vi kan forstå årsagen til at få denne fejl. Det kan kategoriseres i to brede kategorier, dvs. kontrollerede undtagelser og umarkeret undtagelse .
Afkrydset undtagelse
Tjekket undtagelser kaldes kompileringstid undtagelser, fordi disse undtagelser kontrolleres på kompileringstidspunktet af compileren. Compileren sikrer, om programmøren håndterer undtagelsen eller ej. Programmøren skal håndtere undtagelsen; ellers har systemet vist en kompileringsfejl.
CheckedExceptionExample.java
import java.io.*; class CheckedExceptionExample { public static void main(String args[]) { FileInputStream file_data = null; file_data = new FileInputStream('C:/Users/ajeet/OneDrive/Desktop/Hello.txt'); int m; while(( m = file_data.read() ) != -1) { System.out.print((char)m); } file_data.close(); } }
I ovenstående kode forsøger vi at læse Hej.txt fil og vise dens data eller indhold på skærmen. Programmet kaster følgende undtagelser:
- Det FileInputStream(Fil filnavn) konstruktør kaster FileNotFoundException det er kontrolleret undtagelse.
- Det Læs() metoden til FileInputStream klasse kaster IOException .
- Det tæt() metode kaster også IOException.
Produktion:
Hvordan løser man fejlen?
Der er grundlæggende to måder, hvorpå vi kan løse disse fejl.
1) Undtagelserne forekommer i hovedmetoden. Vi kan slippe af med disse kompileringsfejl ved at erklære undtagelsen i hovedmetoden vha kastene Vi erklærer kun IOException, ikke FileNotFoundException, på grund af barnet-forælder-forholdet. IOException-klassen er den overordnede klasse for FileNotFoundException, så denne undtagelse vil automatisk dække af IOException. Vi vil erklære undtagelsen på følgende måde:
class Exception{ public static void main(String args[]) throws IOException { ... ... }
Hvis vi kompilerer og kører koden, forsvinder fejlene, og vi vil se filens data.
2) Vi kan også håndtere disse undtagelser vha try-catch Den måde, vi har brugt ovenfor, er imidlertid ikke korrekt. Vi skal give en meningsfuld besked for hver undtagelsestype. Ved at gøre det ville det være let at forstå fejlen. Vi vil bruge try-catch-blokken på følgende måde:
Undtagelse.java
import java.io.*; class Exception{ public static void main(String args[]) { FileInputStream file_data = null; try{ file_data = new FileInputStream('C:/Users/ajeet/OneDrive/Desktop/programs/Hell.txt'); }catch(FileNotFoundException fnfe){ System.out.println('File Not Found!'); } int m; try{ while(( m = file_data.read() ) != -1) { System.out.print((char)m); } file_data.close(); }catch(IOException ioe){ System.out.println('I/O error occurred: '+ioe); } } }
Vi vil se en korrekt fejlmeddelelse 'Fil ikke fundet!' på konsollen, fordi der ikke er en sådan fil på den placering.
Ikke-markerede undtagelser
Det umarkeret undtagelser er lige modsat kontrolleret undtagelser. Compileren vil ikke kontrollere disse undtagelser på kompileringstidspunktet. Med enkle ord, hvis et program kaster en ukontrolleret undtagelse, og selvom vi ikke håndterede eller erklærede den, ville programmet ikke give en kompileringsfejl. Normalt opstår det, når brugeren giver dårlige data under interaktionen med programmet.
Bemærk: Klassen RuntimeException er i stand til at løse alle de umarkerede undtagelser på grund af forholdet mellem børn og forældre.
UncheckedExceptionExample1.java
class UncheckedExceptionExample1 { public static void main(String args[]) { int postive = 35; int zero = 0; int result = positive/zero; //Give Unchecked Exception here. System.out.println(result); } }
I ovenstående program har vi divideret 35 med 0. Koden ville blive kompileret med succes, men den vil give en ArithmeticException-fejl under kørsel. Ved at dividere et tal med 0 kaster divideret med nul undtagelsen, der er en fjernelse af markeringen.
Produktion:
UncheckedException1.java
class UncheckedException1 { public static void main(String args[]) { int num[] ={10,20,30,40,50,60}; System.out.println(num[7]); } }
Produktion:
I ovenstående kode forsøger vi at få elementet placeret på position 7, men længden af arrayet er 6. Koden kompileres med succes, men kaster ArrayIndexOutOfBoundsException ved kørsel.
Brugerdefineret undtagelse
I Java , vi har allerede nogle indbyggede undtagelsesklasser som ArrayIndexOutOfBoundsException , NullPointerException , og Aritmetisk Undtagelse . Disse undtagelser er begrænset til at udløse på nogle foruddefinerede betingelser. I Java kan vi skrive vores egen undtagelsesklasse ved at udvide Exception-klassen. Vi kan kaste vores egen undtagelse på en bestemt tilstand ved at bruge søgeordet throw. For at oprette en brugerdefineret undtagelse bør vi have grundlæggende viden om det try-catch blokere og kaste søgeord .
Lad os skrive en Java program og opret brugerdefineret undtagelse.
UserDefinedException.java
import java.util.*; class UserDefinedException{ public static void main(String args[]){ try{ throw new NewException(5); } catch(NewException ex){ System.out.println(ex) ; } } } class NewException extends Exception{ int x; NewException(int y) { x=y; } public String toString(){ return ('Exception value = '+x) ; } }
Produktion:
Beskrivelse:
andet hvis java
I ovenstående kode har vi oprettet to klasser, dvs. UserDefinedException og NewException . Det UserDefinedException har vores hovedmetode, og den NewException klasse er vores brugerdefinerede undtagelsesklasse, som udvider undtagelse . I den NewException klasse, opretter vi en variabel x af typen heltal og tildel en værdi til det i konstruktøren. Efter at have tildelt en værdi til denne variabel, returnerer vi undtagelsesmeddelelsen.
I den UserDefinedException klasse, har vi tilføjet en try-catch blok. I prøveafsnittet kaster vi undtagelsen, dvs. NewException og videregive et heltal til det. Værdien videregives til NewException-klassen og returnerer en besked. Vi fanger den besked i catch-blokken og viser den på skærmen.
Forskellen mellem markeret og umarkeret undtagelse
Ja Nej | Afkrydset undtagelse | Ikke markeret undtagelse |
---|---|---|
1. | Disse undtagelser kontrolleres på kompileringstidspunktet. Disse undtagelser håndteres også på kompileringstidspunktet. | Disse undtagelser er lige modsatte af de afkrydsede undtagelser. Disse undtagelser kontrolleres og håndteres ikke på kompileringstidspunktet. |
2. | Disse undtagelser er direkte underklasser af undtagelsen, men er ikke udvidet fra klassen RuntimeException. | De er de direkte underklasser af klassen RuntimeException. |
3. | Koden giver en kompileringsfejl i det tilfælde, hvor en metode kaster en kontrolleret undtagelse. Compileren er ikke i stand til at håndtere undtagelsen alene. | Koden kompilerer uden nogen fejl, fordi undtagelserne undslipper compilerens meddelelse. Disse undtagelser er resultaterne af brugerskabte fejl i programmeringslogikken. |
4. | Disse undtagelser opstår for det meste, når sandsynligheden for fejl er for høj. | Disse undtagelser opstår for det meste på grund af programmeringsfejl. |
5. | Almindelige kontrollerede undtagelser inkluderer IOException, DataAccessException, InterruptedException osv. | Almindelige umarkerede undtagelser omfatter ArithmeticException, InvalidClassException, NullPointerException osv. |
6. | Disse undtagelser udbredes ved hjælp af nøgleordet throws. | Disse udbredes automatisk. |
7. | Det er påkrævet at give try-catch og try-endelig blok for at håndtere den kontrollerede undtagelse. | I tilfælde af ukontrolleret undtagelse er det ikke obligatorisk. |
Bugs eller fejl, som vi ikke ønsker og begrænser den normale udførelse af programmerne, kaldes undtagelser .
ArithmeticException, ArrayIndexOutOfBoundExceptions, ClassNotFoundExceptions osv. er kommet i kategorien Indbygget undtagelse . Nogle gange er de indbyggede undtagelser ikke tilstrækkelige til at forklare eller beskrive bestemte situationer. For at kunne beskrive disse situationer skal vi oprette vores egne undtagelser ved at oprette en undtagelsesklasse som en underklasse af Undtagelse klasse. Disse typer af undtagelser kommer i kategorien Brugerdefineret undtagelse .