Undantagshantering in Java

Vad är undantag i Java?

Undantag i Java är en händelse som avbryter exekveringen av programinstruktioner och stör det normala flödet av programexekveringen. Det är ett objekt som lindar en felhändelseinformation som inträffade inom en metod och den skickas till runtime-systemet. I Java, används undantag främst för att indikera olika typer av feltillstånd.

Det finns två typer av fel:

  1. Kompilera tidsfel
  2. Körtidsfel

Kompileringstidsfel kan återigen klassificeras i två typer:

  • Syntaxfel
  • Semantiska fel

Syntaxfel Exempel:

Istället för att deklarera int a; du deklarerade det av misstag som in a; för vilken kompilator kommer att ge ett fel.

Exempel: Du har deklarerat en variabel int a; och efter några rader kod deklarerar du igen ett heltal som int a;. Alla dessa fel markeras när du kompilerar koden.

Runtime Errors Exempel

Ett körtidsfel kallas en undantag fel. Det är vilken händelse som helst som avbryter det normala flödet av programexekveringen. Exempel på undantag är aritmetiskt undantag, nollpekare undantag, dividera med noll undantag, etc. Undantag i Java är något som är utanför utvecklarens kontroll.

Klicka här. om videon inte är tillgänglig

Varför behöver vi undantag?

Anta att du har kodat ett program för att komma åt servern. Saker och ting fungerade bra medan du utvecklade koden.

Java Undantagshantering

Under själva produktionskörningen är servern nere. När ditt program försökte komma åt det, uppstår ett undantag.

Java Undantagshantering

Hur man hanterar undantag

Hittills har vi sett att undantag ligger utanför utvecklarens kontroll. Men att skylla ditt kodfel på miljöfrågor är ingen lösning. Du behöver en robust programmering som tar hand om exceptionella situationer. Sådan kod är känd som Undantagshanterare.

I vårt exempel skulle bra undantagshantering vara att ansluta till backupservern när servern är nere.

Java Undantagshantering

För att implementera detta, ange din kod för att ansluta till servern (med traditionella if and else-villkor). Du kommer att kontrollera om servern är nere. Om ja, skriv koden för att ansluta till backupservern. Sådan organisation av kod, med användning av "om" och "annat" loop är inte effektiv när din kod har flera java undantag att hantera.

class connect{
	if(Server Up){
	 // code to connect to server
	}
	else{
	 // code to connect to BACKUP server
	}
}

Prova Catch Block

Java ger en inbyggd exceptionell hantering.

  1. Den normala koden går in i a PROVA blockera.
  2. Undantagshanteringskoden går in i FÅNGA blockera

Prova Catch Block

I vårt exempel kommer TRY-blocket att innehålla koden för att ansluta till servern. CATCH-blocket innehåller koden för att ansluta till backupservern. Om servern är uppe kommer koden i CATCH-blocket att ignoreras. Om servern är nere höjs ett undantag och koden i catch-blocket kommer att exekveras.

Prova Catch Block

Så här hanteras undantaget i Java.

Syntax för att använda try & catch

try{
    statement(s)
}
catch (exceptiontype name){
	statement(s)
}

Exempelvis

Steg 1) Kopiera följande kod till en editor

class JavaException {
   public static void main(String args[]){
      int d = 0;
      int n = 20;
      int fraction = n/d;
     System.out.println("End Of Main");
   }
}

Steg 2) Spara filen och kompilera koden. Kör programmet med kommandot, java Javaundantag

Steg 3) Ett aritmetiskt undantag – dividera med noll visas som nedan för rad #5 och rad #6 exekveras aldrig

Steg 4) Låt oss nu se undersöka hur försök och fångst kommer att hjälpa oss att hantera detta undantag. Vi lägger undantaget som orsakar kodraden i en prova block, följt av en fångst blockera. Kopiera följande kod till editorn.

class JavaException {
 public static void main(String args[]) {
  int d = 0;
  int n = 20;
  try {
   int fraction = n / d;
   System.out.println("This line will not be Executed");
  } catch (ArithmeticException e) {
   System.out.println("In the catch Block due to Exception = " + e);
  }
  System.out.println("End Of Main");
 }
}

Steg 5) Spara, kompilera och kör koden. Du får följande utdata

Prova Catch Block

Som du ser hanteras undantaget, och den sista raden kod exekveras också. Observera också att rad #7 inte kommer att köras pga så snart ett undantag höjs, hoppar kontrollflödet till fångstblocket.

Notera: AritmeticException-objektet "e" innehåller information om undantaget som har inträffat, vilket kan vara användbart för att vidta återställningsåtgärder.

Java Undantagsklass Hierarki

Efter att en catch-sats har körts, förbigås de andra och exekveringen fortsätter efter försök/fångst-blocket. De kapslade fångstblocken följer undantagshierarkin.


Java Undantagshierarki

  • Alla undantagsklasser i Java utöka klassen 'Skastbar'. Throwable har två underklasser, Error och Exception
  • Klassen Error definierar undantaget eller de problem som inte förväntas uppstå under normala omständigheter av vårt program, till exempel Minnesfel, Hårdvarufel, JVM-fel, etc.
  • Undantagsklassen representerar de undantag som kan hanteras av vårt program, och vårt program kan återställas från detta undantag med hjälp av försök och fånga block
  • Ett Runtime-undantag är en underklass till undantagsklassen. Undantaget av denna typ representerar undantag som inträffar vid körning och som inte kan spåras vid kompileringstillfället. Ett utmärkt exempel på samma är dividera med noll undantag, eller noll pekare undantag, etc
  • IO-undantag genereras under in- och utgångsoperationer
  • Avbrutna undantag i Java, genereras under flera trådar.

Exempelvis: För att förstå häckning av försök och fånga block

Steg 1) Kopiera följande kod till en editor.

class JavaException {
 public static void main(String args[]) {
  try {
   int d = 1;
   int n = 20;
   int fraction = n / d;
   int g[] = {
    1
   };
   g[20] = 100;
  }
  /*catch(Exception e){
  	System.out.println("In the catch block due to Exception = "+e);
  }*/
  catch (ArithmeticException e) {
   System.out.println("In the catch block due to Exception = " + e);
  } catch (ArrayIndexOutOfBoundsException e) {
   System.out.println("In the catch block due to Exception = " + e);
  }
  System.out.println("End Of Main");
 }
}

Steg 2) Spara filen och kompilera koden. Kör programmet med kommandot, Java Javaundantag.

Steg 3) En ArrayIndexOutOfBoundsException genereras. Ändra värdet på int d till 0. Spara, kompilera och kör koden.

steg 4) Ett ArithmeticException måste genereras.

Steg 5) Avkommentera rad #10 till rad #12. Spara, kompilera och kör koden.

Steg 6) Kompileringsfel? Detta beror på att Exception är basklassen för ArithmeticException Exception. Alla undantag som tas upp av ArithmeticException kan också hanteras av Exception-klassen. Så catch-blocket för ArithmeticException kommer aldrig att få en chans att exekveras vilket gör det överflödigt. Därav kompileringsfelet.

Java Äntligen blockera

Det sista blocket är verkställs oavsett om ett undantag görs i försöksblocket. Det är valfritt att använda med ett försöksblock.

 try {
  statement(s)
 } catch (ExceptiontType name) {

  statement(s)

 } finally {

  statement(s)

 }

Om ett undantag görs i försöksblocket, exekveras slutligen blocket efter att fångstblocket exekveras.

Exempelvis

Steg 1) Kopiera följande kod till en editor.

class JavaException {
   public static void main(String args[]){
    try{
       int d = 0;
       int n =20;
       int fraction = n/d;
    }
  catch(ArithmeticException e){
    System.out.println("In the catch block due to Exception = "+e);
  }
  finally{
	System.out.println("Inside the finally block");
  }
}
}

Steg 2) Spara, kompilera och kör koden.

Steg 3) Förväntad utgång. Slutligen exekveras blocket även om ett undantag höjs.

Steg 4) Ändra värdet på variabel d = 1. Spara, kompilera och kör koden och observera output.Bottom of Form

Sammanfattning

  • An Undantaget är ett körtidsfel vilket avbryter det normala flödet av programexekvering. Störningar under programmets exekvering kallas fel eller undantag.
  • Fel klassificeras i två kategorier
    • Kompilera tidsfel – Syntaxfel, Semantiska fel
    • Runtime errors- Undantag
  • A robust program bör hantera alla undantag och fortsätta med sitt normala flöde av programexekvering. Java ger en inbyggd exceptionell hanteringsmetod
  • Exception Handler är en uppsättning kod som hanterar ett undantag. Undantag kan hanteras i Java med försök och fånga.
  • Försök blockera: Normal kod går på detta block.
  • Fångstblock: Om det finns fel i normal kod kommer den att hamna i detta block