I Java, unntak er en hendelse som oppstår under kjøringen av et program og forstyrrer den normale flyten av programmets instruksjoner. Bugs eller feil som vi ikke ønsker og begrenser programmets normale utførelse av kode, kalles unntak . I denne delen vil vi fokusere på typer unntak i Java og forskjellene mellom de to.
Unntak kan kategoriseres på to måter:
- Innebygde unntak
- Avkrysset unntak
- Uavmerket unntak
- Brukerdefinerte unntak
Innebygd unntak
Unntak som allerede er tilgjengelig i Java-biblioteker omtales som innebygd unntak . Disse unntakene er i stand til å definere feilsituasjonen slik at vi kan forstå årsaken til å få denne feilen. Det kan kategoriseres i to brede kategorier, dvs. sjekket unntak og uavmerket unntak .
Avkrysset unntak
Krysset av unntak kalles kompileringstid unntak fordi disse unntakene kontrolleres ved kompilering av kompilatoren. Kompilatoren sikrer om programmereren håndterer unntaket eller ikke. Programmereren bør måtte håndtere unntaket; ellers har systemet vist en kompileringsfeil.
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 koden ovenfor prøver vi å lese Hei.txt filen og vise dens data eller innhold på skjermen. Programmet gir følgende unntak:
- De FileInputStream(filfilnavn) konstruktør kaster FileNotFoundException som er sjekket unntak.
- De lese() metoden for FileInputStream klasse kaster IOException .
- De Lukk() metoden kaster også IOException.
Produksjon:
Hvordan løser man feilen?
Det er i hovedsak to måter vi kan løse disse feilene på.
1) Unntakene forekommer i hovedmetoden. Vi kan bli kvitt disse kompileringsfeilene ved å erklære unntaket i hovedmetoden ved å bruke kastene Vi erklærer bare IOException, ikke FileNotFoundException, på grunn av forholdet mellom barn og foreldre. IOException-klassen er den overordnede klassen til FileNotFoundException, så dette unntaket dekkes automatisk av IOException. Vi vil erklære unntaket på følgende måte:
class Exception{ public static void main(String args[]) throws IOException { ... ... }
Hvis vi kompilerer og kjører koden, vil feilene forsvinne, og vi vil se dataene til filen.
2) Vi kan også håndtere disse unntakene ved å bruke prøve-fange Måten vi har brukt ovenfor er imidlertid ikke korrekt. Vi må gi en meningsfull melding for hver unntakstype. Ved å gjøre det ville det være lett å forstå feilen. Vi vil bruke try-catch-blokken på følgende måte:
Exception.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 skikkelig feilmelding 'Fil ikke funnet!' på konsollen fordi det ikke er noen slik fil på det stedet.
Unntak som ikke er avmerket
De umerket unntak er bare motsatt av krysset av unntak. Kompilatoren vil ikke sjekke disse unntakene på kompileringstidspunktet. Med enkle ord, hvis et program kaster et ukontrollert unntak, og selv om vi ikke håndterte eller erklærte det, ville ikke programmet gi en kompilasjonsfeil. Vanligvis oppstår det når brukeren gir dårlige data under interaksjonen med programmet.
Merk: Klassen RuntimeException er i stand til å løse alle uavmerkede unntak på grunn av forholdet mellom barn og foreldre.
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 programmet ovenfor har vi delt 35 med 0. Koden ville bli kompilert vellykket, men den vil gi en ArithmeticException-feil ved kjøring. Ved å dele et tall med 0, kastes divisjonen med null unntaket som er et avmerkingsunntak.
Produksjon:
UncheckedException1.java
class UncheckedException1 { public static void main(String args[]) { int num[] ={10,20,30,40,50,60}; System.out.println(num[7]); } }
Produksjon:
I koden ovenfor prøver vi å få elementet plassert på posisjon 7, men lengden på arrayet er 6. Koden kompileres vellykket, men kaster ArrayIndexOutOfBoundsException under kjøring.
Brukerdefinert unntak
I Java , vi har allerede noen innebygde unntaksklasser som ArrayIndexOutOfBoundsException , NullPointerException , og Aritmetisk unntak . Disse unntakene er begrenset til å utløse på noen forhåndsdefinerte forhold. I Java kan vi skrive vår egen unntaksklasse ved å utvide Exception-klassen. Vi kan kaste vårt eget unntak på en bestemt tilstand ved å bruke søkeordet throw. For å lage et brukerdefinert unntak bør vi ha grunnleggende kunnskap om de prøve-fange blokkere og kaste nøkkelord .
La oss skrive en Java-program og opprette brukerdefinerte unntak.
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) ; } }
Produksjon:
Beskrivelse:
string.replaceall i java
I koden ovenfor har vi opprettet to klasser, dvs. UserDefinedException og Nytt unntak . De UserDefinedException har vår hovedmetode, og den Nytt unntak klasse er vår brukerdefinerte unntaksklasse, som utvides unntak . I Nytt unntak klasse, lager vi en variabel x av typen heltall og tilordne en verdi til det i konstruktøren. Etter å ha tildelt en verdi til den variabelen, returnerer vi unntaksmeldingen.
I UserDefinedException klasse, har vi lagt til en prøve-fange blokkere. I prøvedelen kaster vi unntaket, dvs. Nytt unntak og gi et heltall til det. Verdien vil bli sendt til NewException-klassen og returnere en melding. Vi fanger den meldingen i fangstblokken og viser den på skjermen.
Forskjellen mellom avmerket og ukontrollert unntak
Ja Nei | Avkrysset unntak | Uavmerket unntak |
---|---|---|
1. | Disse unntakene kontrolleres ved kompilering. Disse unntakene håndteres også på kompileringstidspunktet. | Disse unntakene er det motsatte av de avmerkede unntakene. Disse unntakene blir ikke kontrollert og håndtert på kompileringstidspunktet. |
2. | Disse unntakene er direkte underklasser av unntak, men ikke utvidet fra RuntimeException-klassen. | De er de direkte underklassene til RuntimeException-klassen. |
3. | Koden gir en kompileringsfeil i tilfellet når en metode kaster et sjekket unntak. Kompilatoren er ikke i stand til å håndtere unntaket på egen hånd. | Koden kompileres uten noen feil fordi unntakene unnslipper kompilatorens varsel. Disse unntakene er resultatet av brukerskapte feil i programmeringslogikken. |
4. | Disse unntakene oppstår for det meste når sannsynligheten for feil er for høy. | Disse unntakene oppstår hovedsakelig på grunn av programmeringsfeil. |
5. | Vanlige sjekkede unntak inkluderer IOException, DataAccessException, InterruptedException, etc. | Vanlige ukontrollerte unntak inkluderer ArithmeticException, InvalidClassException, NullPointerException, etc. |
6. | Disse unntakene spres ved hjelp av nøkkelordet throws. | Disse forplantes automatisk. |
7. | Det er påkrevd å gi prøve-fangst og prøve-endelig-blokken for å håndtere det sjekkede unntaket. | Ved ukontrollert unntak er det ikke obligatorisk. |
Bugs eller feil som vi ikke ønsker og begrenser normal kjøring av programmene, kalles unntak .
ArithmeticException, ArrayIndexOutOfBoundExceptions, ClassNotFoundExceptions etc. kommer i kategorien Innebygd unntak . Noen ganger er de innebygde unntakene ikke tilstrekkelige til å forklare eller beskrive visse situasjoner. For å beskrive disse situasjonene, må vi lage våre egne unntak ved å opprette en unntaksklasse som en underklasse av Unntak klasse. Disse typer unntak kommer i kategorien Brukerdefinert unntak .