Java undantag hanterar du dem rätt?

Java undantag hanterar du dem rätt? / Programmering

En undantag vid programmering innebär ett exceptionellt tillstånd vid någon tidpunkt i programkörningen. Den används när det exceptionella tillståndet kan hanteras bättre någon annanstans i stället för var det uppstår. Tänk på följande exempel:

  • Om du inte öppnar en konfigurationsfil kan hanteringen hanteras högre upp i koden, kanske genom att använda en alternativ konfigurationsfilplats.
  • Åtkomst till ett array-objekt Så här använder du en Java ArrayList Så här använder du en Java ArrayList En Java arraylist är en universalformat som kan ändras. Det ger de flesta av de faciliteter som vanligtvis förväntas av arrays på andra språk. I den här artikeln lär du dig att skapa och använda en arraylist. Läs mer utanför gränserna för arrayen betyder ett programfel. Glad debugging!
  • Ett XML-parsningsfel bör meddelas användaren så att XML-filen kan korrigeras.
  • Programmet som går tom för minne (kanske vid bearbetning av en stor fil) kan åtgärdas genom att kanske öka mängden minne tillgängligt för java-processen.

I alla dessa fall (och mer) bör undantaget hanteras utanför den plats där den genereras så att den bakomliggande orsaken kan hanteras.

Typer av undantag

Bilden nedan visar huvuddelen av Java Exception Hierarchy. Basklassen är Throwable som är underklassad i Undantag och Fel. Klass Undantag är för programrelaterade förhållanden som applikationer kan få i ett försök att rädda situationen. Klass Fel, Å andra sidan är det för att indikera allvarliga fel i Java Run-time Environment som applikationer inte ska fånga. Några exempel är: OutOfMemoryError och Stackoverflowerror.

En Undantag igen är av två typer: kontrollerad och okontrollerad. Ett kontrollerat undantag måste hanteras av anropskoden. Denna regel verkställs av Java-kompilatorn. Ett okontrollerat undantag kan å andra sidan spridas upp i anropskedjan utan att behöva förklara det explicit. Exemplen nedan kommer att klargöra.

Kontrollerade undantag

Följande metod försöker skapa Filereader från en fil. Konstruktören kastar ett kontrollerat undantag FileNotFoundException som måste hanteras av anropskoden eller deklareras att kastas.

Följande kod kommer att inte kompilera eftersom det inte gör det.

Private void loadFile (String filnamn) FileReader in = new FileReader (filnamn);  

Ett sätt att få koden att kompilera är att hantera undantaget (se nedan).

Private void loadFile (String filnamn) försök FileReader in = new FileReader (filnamn));  fånga (FileNotFoundException ex) // hantera undantag här 

Om undantaget inte kan hanteras direkt av den som ringer, måste det deklareras i metodens signatur.

private void loadFile (String filnamn) kastar java.io.FileNotFoundException FileReader in = new FileReader (filnamn));  

Avmarkerade undantag

Ett obekant undantag är ett som är underklasserat från RuntimeException och behöver inte hanteras direkt eller deklareras som ovan. Till exempel resulterar följande kod i a NullPointerException, vilket är en typ av RuntimeException. Koden kompilerar emellertid utan fel sedan NullPointerException är ett okontrollerat undantag.

privat tomt handtagEvent () String name = null; om (name.length ()> 0)  

Förpackningsundantag

Med tanke på ovanstående diskussion om kontrollerade och okontrollerade undantag verkar det som om det är lättare att hantera okontrollerade undantag eftersom du inte behöver deklarera dem eller hantera dem själv. Med den här bekvämligheten i åtanke kan det ibland vara användbart att lägga in ett kontrollerat undantag i ett obekant undantag.

Följande kodexempel visade hur man sätter in ett undantag. Metoden method_1 () kastar en SQLException i sin kropp. För att koden ska kompileras korrekt måste undantaget förklaras kastas.

private void method_1 () kasta SQLException ... kasta ny SQLException;  

När denna metod åberopas från en annan metod (method_2 ()), den metoden kan fånga SQLException och linda den inuti ett obekant undantag, så det behöver inte förklara undantaget i dess metod signatur.

privat tomt metod_2 () försök method_1 ();  fånga (java.sql.SQLException ex) kasta ny RuntimeException (ex);  

Exception Stack Trace

Ett undantagsstackspår hänvisar till mängden aktiva stapelramar, vilka var och en representerar en metodinropning, som fångats av JVM vid det tillfälle som undantaget kastades. Varje stapelram innehåller placeringen av metodanropet inklusive klassnamnet, metodnamnet och eventuellt java-källfilnamnet och radnumret i filen. Det är användbart för att spåra sekvensen av samtal som orsakade felet Java Undantag: Hanterar du dem rätt? Java Undantag: Hanterar du dem rätt? En undantag i programmering innebär ett exceptionellt tillstånd i programkörningen. Den används när villkoret kan hanteras bättre någon annanstans. Tänk på följande exempel på hantering av Java-undantag. Läs mer .

Här är ett typiskt stapelspår, erhållet från undantagsobjektet när det fångades.

Undantag i tråd "main" java.lang.IndexOutOfBoundsException: Index: 8, Size: 5 på java.util.ArrayList.rangeCheck (ArrayList.java:653) på java.util.ArrayList.get (ArrayList.java:429) på sample.sample1.main (sample1.java:24) 

Undantaget som fångas här är IndexOutOfBoundsException. Den innehåller ytterligare information om felet. Stackspåret innehåller 3 stapelramar, som var och en innehåller platsinformationen som visas.

Hantering av undantag

Ett undantag kan hanteras genom att fånga det i en försök fånga blockera och ta oavsett korrigerande åtgärder krävs. De Undantag objektet tillhandahåller flera metoder för att extrahera information om tillståndet som orsakade det.

Följande kod loggar felmeddelandet till en loggfil.

privat tomgångConfig () försök // anropa kod som kan generera en IOException fångst (java.io.IOException ex) // hantera undantag här. Kan vara loggad till en loggfil. log.warning (ex.getMessage ());  

När ett undantag är inslaget inuti en annan kan du hämta det inslagna undantaget:

Kasta orsak = ex.getCause (); log.warning ("Underliggande orsak:" + cause.getMessage ()); 

Behöver du komma åt stapelspåret och kanske extrahera namnet på den metod som orsakade det?

StringBuilder sbuf = ny StringBuilder ("Stack Trace:"); för (StackTraceElement el: ex.getStackTrace ()) sbuf.append (el.getClassName () + "." + el.getMethodName ()) .append ("\ n");  log.warning (sbuf.toString ()); 

Eller kanske logga undantaget och rethrow det?

försök ... fånga (java.io.IOException ex) log.warning (ex.getMessage ()); kasta ex  

De Undantag klassen ger a printStackTrace () metod som kan skriva ut spårspåret själv Print (eller PrintWriter).

försök ... fånga (java.io.IOException ex) PrintStream out = ...; out.println (ex.getMessage ()); ex.printStackTrace (ut);  

Du kan fånga flera typer av undantag i en enda Prova blockera och utföra specifik hantering för varje typ av undantag.

försök // kasta några undantag här fånga (java.io.IOException ex) // IOException specifik hantering här fånga (java.sql.SQLException ex) // SQLException specifik hantering här 

För att fånga flera undantagstyper men använda samma hanteringskod kan du deklarera a fånga blockera med flera typer enligt följande:

försök // kasta några undantag här fånga (java.io.IOException | java.sql.SQLException ex) // IOException och SQLException specifik hantering här fånga (SAXException ex) // SAXException specifik hantering här 

Rengöring av resurser med slutligen

När det handlar om kod som kan kasta undantag, är det viktigt att göra korrekt rengöring av några resurser, till exempel öppna filer Allt du behöver veta om filformat och deras egenskaper Allt du behöver veta om filformat och deras egenskaper Vi använder ordet filer utbytbart: musik, bild, kalkylblad, bildspel och så vidare. Men vad gör en fil en "fil", ändå? Låt oss försöka förstå denna grundläggande del av databehandling. Läs mer, databasanslutningar, etc. Resursrening ska utföras i a till sist blockera. På detta sätt går både normal utgång och exceptionell utgång från ett block på uppringningskoden. De 10 sämsta programmeringsfel i historien De 10 sämsta programmeringsfel i historia I det förflutna förflutet, kodar även smidda förstöringar. Inställningar av lite dålig kod orsakade katastrof på en stor nivå. Följande är 10 av de värsta programmeringsfel i historien. Läs mer .

InputStream i = null; försök ... in = nytt FileInputStream (filnamn); ... fånga (java.io.IOException ex) log.warning (ex.getMessage ());  äntligen // -koden här exekveras genom att avsluta försöksblocket, // om normalt eller på grund av ett undantag om (i! = null) in.close ();  

Try-With-Resources Block

Java 1.7 introducerade prova-med-resurser konstruera vilket gör resursrening enklare. Det ser ut så här:

försök (InputStream in = new FileInputStream (...)) // kod som använder InputStream.  

När koden lämnar blocket (vare sig det är rent eller på grund av ett undantag), Input variabel rengörs automatiskt.

Rensa flera resurser genom att förklara dem alla i blockets huvud.

försök (InputStream in = new FileInputStream (...); Connection con = ...;) // kod som använder InputStream och Connection.  

Alla objekt vars klass utövar AutoCloseable gränssnittet kan rengöras på detta sätt. Följande klass utför en viss specifik uppryckning i stänga() metod.

public class MyClass implementerar AutoCloseable public void close () // uppringningskod här 

Använd en förekomst av denna klass i en prova-med-resurser blockera.

försök (MyClass obj = ny MyClass (...)) // kod som använder MyClass-objektet.  

Några vanligen mötte undantag

Låt oss nu titta på några vanliga undantag.

  • IndexOutOfBoundsException (ej markerad): indikerar index av element som nås är utanför gränserna för en matris, sträng etc..
  • SQLException (kontrollerad): kastas på grund av ett databasfel.
  • IOException (kontrollerad): filåtkomstfel eller fel som har att göra med inmatning och utmatning.
  • InterruptedException (kontrollerad): kastas när ett trådexekvering avbryts.
  • SAXException (kontrollerad): kastas på grund av XML-parsningsfel.
  • NullPointerException (ej markerad): Använd null där ett objekt krävs.

Avslutar

Undantag är den primära metoden för felrapportering och hantering i Java. Korrekt användning av undantag förbättrar kodkvalitet Skriv eller kod Snabbare i din Linux Text Editor med anpassade teman Skriv eller kod Snabbare i din Linux Text Editor med anpassade teman Din Linux textredigerare behöver inte se drab och "funktionell". Varför inte tweak det för att förbättra din produktivitet, vare sig skript och kodning eller använda verktyget som en markupredigerare? Läs mer och hjälp med att lösa problem i produktionen.

Har du några undantagsrelaterade krigshistorier att relatera? Om så är fallet, berätta om det i kommentarfältet nedan.

Bildkrediter: Dmitry Nikolaev via Shutterstock.com

Utforska mer om: Java, Programmering.