Java-undtagelser Håndterer du dem rigtigt?

  • Peter Holmes
  • 0
  • 3555
  • 809
Reklame

En undtagelse i programmering betyder en ekstraordinær tilstand på et tidspunkt i programudførelsen. Det bruges, når den usædvanlige tilstand kan håndteres andetsteds snarere end hvor den er stødt på. Overvej følgende eksempler:

  • Manglende åbning af en konfigurationsfil kan håndteres bedre højere op i koden, måske ved at bruge en alternativ konfigurationsfilplacering.
  • Adgang til et array-element Sådan bruges en Java ArrayList Sådan bruges en Java ArrayList En Java-arraylist er en generel størrelse, der kan ændres til størrelse. Det giver de fleste af de faciliteter, der generelt forventes af matriser på andre sprog. I denne artikel lærer du at opsætte og bruge en arraylist. uden for arrayets grænser betyder en programfejl. Tilfreds debugging!
  • En XML-parsingsfejl skal bringes til brugerens varsel, så XML-filen kan rettes.
  • Programmet, der løber tør for hukommelse (måske når der behandles en stor fil) kan rettes ved måske at øge mængden af ​​hukommelse, der er tilgængelig til java-processen.

I alle disse tilfælde (og mere) skal undtagelsen håndteres uden for det sted, hvor den er genereret, så den underliggende årsag kan løses.

Typer af undtagelser

Billedet herunder viser hoveddelene i Java-undtagelseshierarkiet. Basisklassen er Throwable som er underklasseret i Undtagelse og Fejl. klasse Undtagelse er til programrelaterede forhold, som applikationer kan fange i et forsøg på at redde situationen. klasse Fejl, på den anden side er til at indikere alvorlige fejl i Java-runtime-miljøet, hvilke applikationer ikke skal fange. Nogle eksempler er: OutOfMemoryError og StackOverflowError.

en Undtagelse igen er af to typer: markeret og ikke markeret. En kontrolleret undtagelse skal håndteres med opkaldskoden. Denne regel håndhæves af java-kompilatoren. En ikke-afkrydset undtagelse kan derimod forplantes op i opkaldskæden uden at skulle erklære det eksplicit. Eksemplerne nedenfor afklarer.

Kontrollerede undtagelser

Følgende metode forsøger at oprette FileReader fra en fil. Konstruktøren kaster en kontrolleret undtagelse FileNotFoundException som skal håndteres med opkaldskoden eller erklæres for at blive kastet.

Følgende kode vil ikke kompilere, da det ikke gør det.

privat tomrum loadFile (strengnavn) FileReader i = nyt FileReader (filnavn);  

En måde at få koden til at udarbejde er at håndtere undtagelsen (se nedenfor).

privat tomrum loadFile (strengnavn) prøv FileReader i = nyt FileReader (filnavn));  fangst (FileNotFoundException ex) // håndterer undtagelse her 

Hvis undtagelsen ikke kan håndteres direkte af den, der ringer, skal den deklareres i metodesignaturen.

privat tomrum loadFile (strengnavn) kaster java.io.FileNotFoundException FileReader i = nyt FileReader (filnavn));  

Ikke-markerede undtagelser

En ikke-markeret undtagelse er en, der er underklasse fra RuntimeException og behøver ikke håndteres direkte eller erklæres som ovenfor. For eksempel resulterer følgende kode i a NullPointerException, som er en type RuntimeException. Koden kompileres dog uden fejl siden NullPointerException er en ikke-markeret undtagelse.

private void handleEvent () String name = null; if (navn.længde ()> 0)  

Indpakning af undtagelser

I betragtning af ovenstående diskussion om afkrydsede og ikke-kontrollerede undtagelser ser det ud til, at det er lettere at håndtere ukontrollerede undtagelser, da du ikke behøver at erklære dem eller håndtere dem selv. Med den bekvemmelighed i tankerne kan det undertiden være nyttigt at indpakke en markeret undtagelse i en ikke-markeret undtagelse.

Følgende kodeeksempel viser, hvordan man indpakker en undtagelse. Metoden method_1 () kaster en SQLException i sin krop. For at koden skal samles korrekt, skal undtagelsen erklæres for at blive kastet.

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

Når denne metode påberåbes fra en anden metode (method_2 ()), kan denne metode fange SQLException og pak den ind i en ikke-markeret undtagelse, så den ikke behøver at erklære undtagelsen i metodesignatur.

private void method_2 () try method_1 ();  fangst (java.sql.SQLException ex) kast ny RuntimeException (ex);  

Undtagelse Stack Trace

En undtagelsestakelspor henviser til matrixen af ​​aktive stakrammer, der hver repræsenterer en metode-påkaldelse, fanget af JVM på det tidspunkt, hvor undtagelsen blev kastet. Hver stakramme inkluderer placeringen af ​​metoden tilkaldelse inklusive klassens navn, metodenavn og muligvis java kildefilnavnet og linjenummeret i filen. Det er nyttigt at spore sekvensen af ​​opkald, der forårsagede fejlen Java Undtagelser: Håndterer du dem rigtigt? Java-undtagelser: Håndterer du dem rigtigt? En undtagelse i programmering betyder en ekstraordinær betingelse i programudførelsen. Den bruges, når tilstanden kan håndteres bedre andre steder. Overvej følgende eksempler på Java-undtagelseshåndtering. .

Her er et typisk stakespor, hentet fra undtagelsesobjektet, da det blev fanget.

Undtagelse i tråd "hoved" java.lang.IndexOutOfBoundsException: Indeks: 8, Størrelse: 5 ved java.util.ArrayList.rangeCheck (ArrayList.java:653) på java.util.ArrayList.get (ArrayList.java:429) kl. sample.sample1.main (sample1.java:24) 

Undtagelsen fanget her er IndexOutOfBoundsException. Det inkluderer yderligere oplysninger om fejlen. Stakkelsporet indeholder 3 stakrammer, som hver inkluderer placeringsoplysningerne som vist.

Håndtering af undtagelser

En undtagelse kan håndteres ved at fange den i en prøv bifangst blokerer og træffer de nødvendige korrigerende handlinger. Det Undtagelse objekt tilvejebringer adskillige metoder til at udtrække oplysninger om den tilstand, der har forårsaget den.

Følgende kode logger fejlmeddelelsen til en logfil.

privat tomrum loadConfig () prøv // påkald kode, der muligvis genererer en IOException fangst (java.io.IOException ex) // håndterer undtagelse her. Kan være log på en logfil. log.warning (ex.getMessage ());  

Når en undtagelse er pakket ind i en anden, kan du hente den indpakkede undtagelse:

Throwable årsag = ex.getCause (); log.warning ("Underliggende årsag:" + årsag.getMessage ()); 

Har du brug for at få adgang til stakesporet, og måske udtrække navnet på metoden, der har forårsaget den?

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

Eller måske, log undtagelsen og træk den igen?

prøv … fangst (java.io.IOException ex) log.warning (ex.getMessage ()); kaste eks;  

Det Undtagelse klasse giver en printStackTrace () metode, der kan udskrive stakkelsporen til din egen PrintStream (eller PrintWriter).

prøv … fangst (java.io.IOException ex) PrintStream out = ...; out.println (ex.getMessage ()); ex.printStackTrace (ud);  

Du kan fange flere typer undtagelser i en enkelt prøve blokerer og udfør specifik håndtering for hver type undtagelse.

prøv // kaster nogle undtagelser her fangst (java.io.IOException ex) // IOException-specifik håndtering her catch (java.sql.SQLException ex) // SQLException-specifik håndtering her 

For at fange flere undtagelsestyper men bruge den samme håndteringskode, kan du erklære a fangst bloker med flere typer som følger:

prøv // kaster nogle undtagelser her fangst (java.io.IOException | java.sql.SQLException ex) // IOException og SQLException-specifik håndtering her fangst (SAXException ex) // SAXException-specifik håndtering her 

Oprydning af ressourcer med endelig

Når man beskæftiger sig med kode, der kan kaste undtagelser, er det vigtigt at udføre korrekt oprydning af alle ressourcer, såsom åbnede filer Alt hvad du behøver at vide om filformater og deres egenskaber Alt hvad du behøver at vide om filformater og deres egenskaber Vi bruger ordet fil udskifteligt: ​​musik, billede, regneark, slideshow og så videre. Men hvad gør en fil alligevel til en "fil"? Lad os prøve og forstå denne grundlæggende del af computing. , databaseforbindelser osv. Rengøring af ressourcer skal udføres i en langt om længe blok. På denne måde påkalder både normal udgang og usædvanlig udgang fra en blok oprydningskoden De 10 værste programmeringsfejl i historien De 10 værste programmeringsfejl i historien I sin lagrede fortid kodede også smed ødelæggelse. Forekomster af en smule dårlig kode forårsagede katastrofe på et større niveau. Følgende er 10 af de værste programmeringsfejl i historien. .

InputStream in = null; prøv … in = nyt FileInputStream (filnavn);… fangst (java.io.IOException ex) log.warning (ex.getMessage ());  endelig // -kode her udføres ved afslutning af prøveblokken, // hvad enten det er normalt eller på grund af en undtagelse, hvis (i! = null) in.close ();  

Try-With-Resources-blok

Java 1.7 introducerede prøve-med-ressourcer konstruere, hvilket gør ressourceoprydning lettere. Det ser sådan ud:

prøv (InputStream i = ny FileInputStream (…)) // kode, der bruger InputStream.  

Når koden forlader blokken (uanset om det er rent eller på grund af en undtagelse), InputStream variabel renses automatisk.

Oprydning af flere ressourcer ved at deklarere dem alle i blokkehovedet.

prøv (InputStream i = ny FileInputStream (...); Forbindelse con = ...;) // kode, der bruger InputStream og forbindelsen.  

Ethvert objekt, hvis klasse implementerer AutoCloseable interface kan ryddes op på denne måde. Følgende klasse udfører nogle specifikke oprydninger i tæt() metode.

offentlig klasse MyClass implementerer AutoCloseable public void close () // oprydningskode her 

Brug en forekomst af denne klasse i a prøve-med-ressourcer blok.

try (MyClass obj = new MyClass (…)) // kode, der bruger MyClass-objektet.  

Nogle almindeligt konstaterede undtagelser

Lad os nu se på nogle almindelige undtagelser.

  • IndexOutOfBoundsException (ikke markeret): indikerer, at indeks for element, der åbnes, er uden for grænserne for en matrix, streng osv.
  • SQLException (markeret): kastet på grund af en databasefejl.
  • IOException (markeret): filadgangsfejl eller fejl, der har at gøre med input og output.
  • InterruptedException (markeret): kastet, når en trådudførelse afbrydes.
  • SAXException (markeret): kastet på grund af XML-parsingsfejl.
  • NullPointerException (ikke markeret): bruger null, hvor et objekt er påkrævet.

Afslutter

Undtagelser er den primære metode til fejlrapportering og styring i Java. Korrekt brug af undtagelser forbedrer kodekvaliteten Skriv eller kode hurtigere i din Linux-teksteditor med brugerdefinerede temaer Skriv eller kode hurtigere i din Linux-teksteditor med brugerdefinerede temaer Din Linux-teksteditor behøver ikke at se trist ud og "funktionel." Hvorfor ikke finjustere det for at forbedre din produktivitet, uanset om manuskript og kodning eller bruger værktøjet som en markeringseditor? og hjælp til at løse problemer i produktionen.

Har du nogen undtagelsesrelaterede krigshistorier at fortælle? I bekræftende fald, fortæl os om det i kommentarfeltet nedenfor.

Billedkredit: Dmitry Nikolaev via Shutterstock.com




Endnu ingen kommentarer

Om moderne teknologi, enkel og overkommelig.
Din guide i en verden af moderne teknologi. Lær hvordan du bruger de teknologier og gadgets, der omgiver os hver dag, og lær, hvordan du finder interessante ting på Internettet.