Java-unntak håndterer du dem riktig?

Java-unntak håndterer du dem riktig? / programmering

En unntak i programmering betyr en eksepsjonell tilstand på et tidspunkt i programgjennomføringen. Den brukes når den eksepsjonelle tilstanden kan håndteres bedre andre steder enn hvor den oppstår. Vurder følgende eksempler:

  • Unnlatelse av å åpne en konfigurasjonsfil kan bedre håndteres høyere opp i koden, kanskje ved å bruke en alternativ konfigurasjonsfilplassering.
  • Få tilgang til et array-element Slik bruker du en Java ArrayList Slik bruker du en Java ArrayList En Java-arraylist er en generell resizeable array. Det gir de fleste av fasilitetene som generelt forventes av arrays på andre språk. I denne artikkelen lærer du å sette opp og bruke en arraylist. Les mer utenfor grensene av arrayet betyr et programfeil. Glad feilsøking!
  • En XML-parsingfeil bør bringes til varsel av brukeren, slik at XML-filen kan korrigeres.
  • Programmet som går tom for minne (kanskje når du behandler en stor fil) kan korrigeres ved å øke mengden minne som er tilgjengelig for java-prosessen.

I alle disse tilfellene (og mer) bør unntaket håndteres utenfor stedet der det genereres, slik at den underliggende årsaken kan adresseres.

Typer unntak

Bildet nedenfor viser hoveddelene av Java Exception Hierarchy. Baseklassen er Throwable som er underklassifisert i Unntak og Feil. Klasse Unntak er for programrelaterte forhold som applikasjoner kan fange i et forsøk på å redde situasjonen. Klasse Feil, På den annen side er det for å indikere alvorlige feil i Java Run-Time Environment som applikasjoner ikke bør fange. Noen eksempler er: OutOfMemoryError og StackOverflowError.

en Unntak igjen er det to typer: kontrollert og ukontrollert. Et kontrollert unntak skal håndteres av anropskoden. Denne regelen håndheves av java kompilatoren. Et ukontrollert unntak, derimot, kan formidles opp i anropskjeden uten at det må utpekes eksplisitt. Eksemplene nedenfor vil avklare.

Kontrollerte unntak

Følgende metode forsøker å opprette Filereader fra en fil. Konstruktøren kaster et kontrollert unntak FileNotFoundException som må håndteres av anropskoden eller erklært å bli kastet.

Følgende kode vil ikke kompilere siden det ikke gjør det.

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

En måte å få koden til å kompilere er å håndtere unntaket (se nedenfor).

private void loadFile (String filnavn) prøv FileReader in = new FileReader (filnavn));  fangst (FileNotFoundException ex) // håndtak unntak her 

Hvis unntaket ikke kan håndteres direkte av den som ringer, må det deklareres i metodens signatur.

Private void loadFile (String filnavn) kaster java.io.FileNotFoundException FileReader in = new FileReader (filnavn));  

Ukontrollerte unntak

Et ukontrollert unntak er en som er underklasse fra RuntimeException og trenger ikke håndteres direkte eller erklært som ovenfor. For eksempel resulterer følgende kode i a NullPointerException, som er en type RuntimeException. Koden kompilerer imidlertid uten feil siden NullPointerException er et ukontrollert unntak.

privat tomt håndtakEvent () Strenge navn = null; hvis (name.length ()> 0)  

Innpakning unntak

Gitt ovenstående diskusjon om sjekket og ukontrollert unntak, ser det ut til at det er lettere å håndtere ukontrollerte unntak, siden du ikke må deklarere dem eller håndtere dem selv. Med den bekvemmeligheten i tankene kan det noen ganger være nyttig å pakke inn et kontrollert unntak i et ukontrollert unntak.

Følgende kodeeksempel viste hvordan man kan pakke inn et unntak. Metoden method_1 () kaster en SQLException i sin kropp. For at koden skal kompilere riktig, må unntaket deklareres å bli kastet.

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

Når denne metoden er påkalt fra en annen metode (method_2 ()), den metoden kan fange SQLException og pakk den inn i et ukontrollert unntak, så det trenger ikke å erklære unntaket i metodenes signatur.

privat tomrommetode_2 () prøv method_1 ();  fangst (java.sql.SQLException ex) kaste ny RuntimeException (ex);  

Unntak Stack Trace

Et unntaksstackspor refererer til en rekke aktive stabelrammer, som hver representerer en metodeinnkalling, fanget av JVM på det tidspunktet unntaket ble kastet. Hver stabelramme inneholder plasseringen av metodeinnkallingen, inkludert klassenavnet, metodenavnet, og muligens java kildefilnavnet og linjenummeret i filen. Det er nyttig for å spore sekvensen av samtaler som forårsaket feilen Java-unntak: Håndterer du dem riktig? Java unntak: Håndterer du dem riktig? En unntak i programmering betyr en eksepsjonell tilstand i programgjennomføringen. Den brukes når tilstanden kan håndteres bedre andre steder. Vurder følgende eksempler på håndtering av Java-unntak. Les mer .

Her er en typisk stakkspor, oppnådd fra unntaksobjektet da den ble fanget.

Unntak i tråden "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) 

Unntaket fanget her er IndexOutOfBoundsException. Den inneholder tilleggsinformasjon om feilen. Stakkesporet inneholder 3 stakkrammer, som hver inneholder plasseringsinformasjonen som vist.

Håndtering Unntak

Et unntak kan håndteres ved å fange det i a prøve-fangst blokkere og ta uansett korrigerende tiltak er nødvendig. De Unntak objektet gir flere metoder for å trekke ut informasjon om tilstanden som forårsaket det.

Følgende kode logger feilmeldingen til en loggfil.

privat ugyldig belastningConfig () prøv // påkalle kode som kan generere en IOException fange (java.io.IOException ex) // håndtak unntak her. Kan logge på en loggfil. log.warning (ex.getMessage ());  

Når et unntak er pakket inn i en annen, kan du hente det innpakket unntaket:

Kastbar årsak = ex.getCause (); log.warning ("Underliggende årsak:" + cause.getMessage ()); 

Trenger du tilgang til stablingssporet, og kanskje trekker navnet på metoden som forårsaket den?

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

Eller kanskje, logg unntaket og rethrow det?

prøv ... catch (java.io.IOException ex) log.warning (ex.getMessage ()); kaste ex;  

De Unntak klassen gir en printStackTrace () metode som kan skrive ut stakksporet til din egen Print (eller Printwriter).

prøv ... catch (java.io.IOException ex) PrintStream out = ...; out.println (ex.getMessage ()); ex.printStackTrace (ut);  

Du kan ta flere typer unntak i en enkelt prøve blokkere og utføre spesifikk håndtering for hver type unntak.

Prøv // kaster noen unntak her fange (java.io.IOException ex) // IOException spesifikk håndtering her fange (java.sql.SQLException ex) // SQLException spesifikk håndtering her 

For å fange flere unntakstyper, men bruk samme håndteringskode, kan du deklarere a å fange blokkere med flere typer som følger:

Prøv // kaster noen unntak her fange (java.io.IOException | java.sql.SQLException ex) // IOException og SQLException spesifikk håndtering her fange (SAXException ex) // SAXException spesifikk håndtering her 

Rengjøring av ressurser med endelig

Når du arbeider med kode som kan kaste unntak, er det viktig å utføre riktig opprydning av ressurser, for eksempel åpne filer Alt du trenger å vite om filformater og deres egenskaper Alt du trenger å vite om filformater og deres egenskaper Vi bruker ordet fil utskiftbart: musikk, bilde, regneark, lysbildefremvisning, og så videre. Men hva gjør en fil en "fil", uansett? La oss prøve å forstå denne grunnleggende delen av databehandling. Les mer, databaseforbindelser, etc. Ressursopprydding skal utføres i a endelig blokkere. På denne måten går både normal utgang og eksepsjonell utgang fra en blokk på oppryddingskoden. De 10 verste programmeringsfeilene i historien De 10 verste programmeringsfeilene i historien I sin lagrede fortid, også koding av ødelagt ødeleggelse. Forekomster av en liten dårlig kode forårsaket katastrofe på et stort nivå. Følgende er 10 av de verste programmeringsfeilene i historien. Les mer .

InputStream i = null; prøv ... in = new FileInputStream (filnavn); ... catch (java.io.IOException ex) log.warning (ex.getMessage ());  endelig // kode her blir utført på å avslutte prøveblokken, // enten normalt eller på grunn av et unntak hvis (i! = null) in.close ();  

Try-With-Resources Block

Java 1.7 introduserte prøve-med-ressurser konstruere som gjør opprydding av ressurser enklere. Det ser slik ut:

prøv (InputStream in = new FileInputStream (...)) // kode som bruker InputStream.  

Når koden går ut av blokken (enten rent eller på grunn av et unntak), vil Input variabel blir automatisk rengjort.

Oppryd flere ressurser ved å erklære dem alle i blokkens hode.

prøv (InputStream in = new FileInputStream (...); Connection con = ...;) // kode som bruker InputStream og Connection.  

Ethvert objekt hvis klasse implementerer AutoCloseable grensesnittet kan rengjøres på denne måten. Følgende klasse utfører noen spesifikk opprydding i Lukk() metode.

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

Bruk en forekomst av denne klassen i a prøve-med-ressurser blokkere.

prøv (MyClass obj = ny MyClass (...)) // kode som bruker MyClass-objektet.  

Noen opplevde ofte unntak

La oss nå se på noen ofte oppdagede unntak.

  • IndexOutOfBoundsException (ukontrollert): Indikerer at indeksen for elementet som er tilgjengelig, er utenfor rammen av en matrise, streng osv.
  • SQLException (merket): kastet på grunn av en databasefeil.
  • IOException (merket): filtilgangsfeil eller feil som har å gjøre med inngang og utgang.
  • InterruptedException (merket): kastet når en gjengivelse avbrytes.
  • SAXException (merket): kastet på grunn av XML-parsing feil.
  • NullPointerException (ukontrollert): Bruk null der et objekt er påkrevd.

Wrapping Up

Unntak er den primære metoden for feilrapportering og styring i Java. Riktig bruk av unntak øker kodekvaliteten Skriv eller Kode raskere i Linux Text Editor med egendefinerte temaer Skriv eller kode raskere i Linux Text Editor med egendefinerte temaer Linux-tekstredigereren trenger ikke å se drab og "funksjonell". Hvorfor ikke tweak det for å forbedre produktiviteten din, om du vil skanne og koding eller bruke verktøyet som en markupredigerer? Les mer og hjelp til å løse problemer i produksjonen.

Har du noen unntaksrelaterte krigshistorier å forholde seg? I så fall, fortell oss om det i kommentarfeltet nedenfor.

Bildekreditt: Dmitry Nikolaev via Shutterstock.com

Utforsk mer om: Java, Programmering.