I Java, undantag är en händelse som inträffar under körningen av ett program och stör det normala flödet av programmets instruktioner. Buggar eller fel som vi inte vill ha och begränsar vårt programs normala exekvering av kod kallas undantag . I det här avsnittet kommer vi att fokusera på typer av undantag i Java och skillnaderna mellan de två.
Undantag kan kategoriseras på två sätt:
- Inbyggda undantag
- Markerat undantag
- Omarkerat undantag
- Användardefinierade undantag
Inbyggt undantag
Undantag som redan finns i Java bibliotek kallas inbyggt undantag . Dessa undantag kan definiera felsituationen så att vi kan förstå orsaken till att vi får det här felet. Det kan delas in i två breda kategorier, dvs. kontrollerade undantag och okontrollerat undantag .
Markerat undantag
Kontrollerade undantag kallas kompileringstid undantag eftersom dessa undantag kontrolleras vid kompilering av kompilatorn. Kompilatorn säkerställer om programmeraren hanterar undantaget eller inte. Programmeraren bör behöva hantera undantaget; annars har systemet visat ett kompileringsfel.
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 ovan försöker vi läsa Hej.txt filen och visa dess data eller innehåll på skärmen. Programmet ger följande undantag:
- De FileInputStream(Fil filnamn) konstruktören kastar FileNotFoundException det är kontrollerat undantag.
- De läsa() metod för FileInputStream klass kastar IOException .
- De stänga() metoden kastar också IOException.
Produktion:
Hur löser man felet?
Det finns i princip två sätt genom vilka vi kan lösa dessa fel.
1) Undantagen förekommer i huvudmetoden. Vi kan bli av med dessa kompileringsfel genom att deklarera undantaget i huvudmetoden med hjälp av kasten Vi deklarerar endast IOException, inte FileNotFoundException, på grund av relationen mellan barn och förälder. Klassen IOException är moderklassen för FileNotFoundException, så detta undantag kommer automatiskt att täckas av IOException. Vi kommer att förklara undantaget på följande sätt:
bara nick
class Exception{ public static void main(String args[]) throws IOException { ... ... }
Om vi kompilerar och kör koden försvinner felen och vi ser filens data.
2) Vi kan också hantera dessa undantag med hjälp av försök fånga Det sätt som vi har använt ovan är dock inte korrekt. Vi måste ge ett meningsfullt meddelande för varje undantagstyp. Genom att göra det skulle det vara lätt att förstå felet. Vi kommer att använda try-catch-blocket på följande sätt:
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 kommer att se ett korrekt felmeddelande 'Filen hittades inte!' på konsolen eftersom det inte finns någon sådan fil på den platsen.
Omarkerade undantag
De okontrollerad undantagen är precis motsatsen till kontrollerade undantag. Kompilatorn kontrollerar inte dessa undantag vid kompilering. Med enkla ord, om ett program ger ett okontrollerat undantag, och även om vi inte hanterade eller deklarerade det, skulle programmet inte ge ett kompileringsfel. Vanligtvis inträffar det när användaren tillhandahåller dålig data under interaktionen med programmet.
Obs! Klassen RuntimeException kan lösa alla omarkerade undantag på grund av relationen mellan barn och förälder.
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 ovan har vi dividerat 35 med 0. Koden skulle kompileras framgångsrikt, men den kommer att ge ett ArithmeticException-fel vid körning. Om du dividerar ett tal med 0 kastar dela med noll undantag som är ett avmarkerat undantag.
typer av maskininlärning
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 ovanstående kod försöker vi få elementet placerat vid position 7, men längden på arrayen är 6. Koden kompileras framgångsrikt, men kastar ArrayIndexOutOfBoundsException vid körning.
Användardefinierat undantag
I Java , vi har redan några inbyggda undantagsklasser som ArrayIndexOutOfBoundsException , NullPointerException , och ArithmeticException . Dessa undantag är begränsade till att utlösas på vissa fördefinierade villkor. I Java kan vi skriva vår egen undantagsklass genom att utöka klassen Exception. Vi kan göra vårt eget undantag på ett visst tillstånd med hjälp av nyckelordet throw. För att skapa ett användardefinierat undantag bör vi ha grundläggande kunskaper om de försök fånga blockera och kasta nyckelord .
Låt oss skriva en Java-program och skapa användardefinierat undantag.
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:
Beskrivning:
I ovanstående kod har vi skapat två klasser, dvs. UserDefinedException och NewException . De UserDefinedException har vår huvudsakliga metod, och den NewException class är vår användardefinierade undantagsklass, som sträcker sig undantag . I den NewException klass skapar vi en variabel x av typen heltal och tilldela ett värde till det i konstruktorn. Efter att ha tilldelat ett värde till den variabeln returnerar vi undantagsmeddelandet.
numrerade alfabetet
I den UserDefinedException klass har vi lagt till en försök fånga blockera. I försöksavsnittet kastar vi undantaget, dvs. NewException och skicka ett heltal till det. Värdet skickas till klassen NewException och returnerar ett meddelande. Vi fångar det meddelandet i fångstblocket och visar det på skärmen.
Skillnaden mellan markerat och omarkerat undantag
Ja Nej | Markerat undantag | Omarkerat undantag |
---|---|---|
1. | Dessa undantag kontrolleras vid kompilering. Dessa undantag hanteras också vid kompilering. | Dessa undantag är precis motsatta de markerade undantagen. Dessa undantag kontrolleras och hanteras inte vid kompilering. |
2. | Dessa undantag är direkta underklasser av undantag men utökas inte från klassen RuntimeException. | De är de direkta underklasserna till klassen RuntimeException. |
3. | Koden ger ett kompileringsfel i fallet när en metod kastar ett kontrollerat undantag. Kompilatorn kan inte hantera undantaget på egen hand. | Koden kompileras utan några fel eftersom undantagen undgår kompilatorns meddelande. Dessa undantag är resultatet av användarskapade fel i programmeringslogiken. |
4. | Dessa undantag uppstår oftast när sannolikheten för misslyckande är för hög. | Dessa undantag uppstår mestadels på grund av programmeringsfel. |
5. | Vanliga markerade undantag inkluderar IOException, DataAccessException, InterruptedException, etc. | Vanliga omarkerade undantag inkluderar ArithmeticException, InvalidClassException, NullPointerException, etc. |
6. | Dessa undantag sprids med nyckelordet throws. | Dessa sprids automatiskt. |
7. | Det krävs att du tillhandahåller försök-fånga och försök-slutligen-blocket för att hantera det markerade undantaget. | Vid okontrollerat undantag är det inte obligatoriskt. |
Buggar eller fel som vi inte vill ha och begränsar den normala exekveringen av programmen kallas undantag .
ArithmeticException, ArrayIndexOutOfBoundExceptions, ClassNotFoundExceptions etc. kommer i kategorin Inbyggt undantag . Ibland är de inbyggda undantagen inte tillräckliga för att förklara eller beskriva vissa situationer. För att beskriva dessa situationer måste vi skapa våra egna undantag genom att skapa en undantagsklass som en underklass till Undantag klass. Dessa typer av undantag kommer i kategorin Användardefinierat undantag .