Annonse

Et unntak i programmering indikerer en eksepsjonell tilstand på et tidspunkt i utførelsen av programmet. Det brukes når den eksepsjonelle tilstanden kan håndteres bedre andre steder enn der den oppstår. Tenk på følgende eksempler:

  • Unnlatelse av å åpne en konfigurasjonsfil kan håndteres bedre opp i koden, kanskje ved å bruke en alternativ konfigurasjonsfilplassering.
  • Få tilgang til en matrise element Hvordan bruke en Java ArrayListEn Java-arraylist er en generell størrelse som kan endres størrelse. Det gir de fleste fasiliteter som vanligvis forventes av matriser på andre språk. I denne artikkelen lærer du å sette opp og bruke en arraylist. Les mer utenfor grensene for matrisen betyr en programfeil. Glad avlusing!
  • En XML-parsingfeil bør bringes til varsel fra brukeren, slik at XML-filen kan rettes.
  • Programmet som går tom for minne (kanskje når du behandler en stor fil) kan utbedres 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 i Java Exception Hierarchy. Grunnklassen er Throwable som er underklasse i Unntak og Feil. Klasse Unntak er for programrelaterte forhold som applikasjoner kan fange i et forsøk på å berge situasjonen. Klasse Feil, derimot, er for å indikere alvorlige feil i Java-kjøretidsmiljøet som applikasjoner ikke skal fange. Noen eksempler er: OutOfMemoryError og StackOverflowError.

Unntak Hierarki

en Unntak igjen er av to typer: sjekket og ikke avmerket. Et kontrollert unntak må håndteres av ringekoden. Denne regelen håndheves av Java-kompilatoren. Et ukontrollert unntak kan derimot forplantes opp i anropskjeden uten å måtte erklære det eksplisitt. Eksemplene nedenfor vil avklare.

Sjekket unntak

Følgende metode prøver å lage Filereader fra en fil. Konstruktøren kaster et sjekket unntak FileNotFoundException som må håndteres med ringekoden eller deklareres kastet.

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

private void loadFile (strengnavn) {FileReader i = nytt FileReader (filnavn); }

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

private void loadFile (strengnavn) {prøv {FileReader i = nytt FileReader (filnavn)); {} fangst (FileNotFoundException ex) {// håndterer unntak her} }

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

private void loadFile (strengnavn) kaster java.io. FileNotFoundException. {FileReader i = nytt FileReader (filnavn)); { }

Unchecked Unntak

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

private void handleEvent () {String name = null; if (name.length ()> 0) {} }

Innpakning unntak

Gitt ovennevnte diskusjon om avmerkede og ikke-merkede unntak, ser det ut til at det er lettere å håndtere ikke-merkede unntak, siden du ikke trenger å erklære dem eller håndtere dem selv. Med den bekvemmeligheten i bakhodet, kan det noen ganger være nyttig å pakke inn et sjekket unntak i et ikke merket unntak.

Følgende kodeeksempel viste hvordan du pakker et unntak. Metoden method_1 () kaster en SQLException i kroppen. For at koden skal samles riktig, må unntaket erklæres for å bli kastet.

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

Når denne metoden påberopes fra en annen metode (method_2 ()), kan den metoden fange SQLException og pakk det inn i et ikke-merket unntak, slik at det ikke trenger å erklære unntaket i metodesignaturen.

private void method_2 () {prøv {method_1 (); } fangst (java.sql. SQLException ex) {kaste ny RuntimeException (ex); } }

Unntak Stack Trace

En unntakstakkespor refererer til rekken av aktive stabelrammer, som hver representerer en metodeinnkalling, fanget av JVM på det tidspunktet unntaket ble kastet. Hver stabelramme inkluderer plasseringen av metoden tilkalling inkludert klassens navn, metodenavn og muligens java kildefilnavn og linjenummer i filen. Det er nyttig for å spore sekvensen av samtaler som forårsaket feilen Java-unntak: Håndterer du dem riktig?Et unntak i programmering betyr en eksepsjonell tilstand i utførelsen av programmet. Den brukes når tilstanden kan håndteres bedre andre steder. Tenk på følgende eksempler på Java-unntakshåndtering. Les mer .

Her er en typisk stakkspor, hentet fra unntaksobjektet da den ble fanget.

Unntak i tråd "hoved" java.lang. IndexOutOfBoundsException: Index: 8, Size: 5 at 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. Stabelsporen inneholder 3 stabelrammer, som hver inneholder posisjonsinformasjonen som vist.

Håndtere unntak

Et unntak kan håndteres ved å fange det i en try-catch blokkering og iverksette korrigerende tiltak som kreves. De Unntak objektet gir flere metoder for å trekke ut informasjon om tilstanden som forårsaket den.

Følgende kode logger feilmeldingen til en loggfil.

private void loadConfig () {prøv {// påkalle kode som kan generere en IOException} fangst (java.io. IOException eks) {// håndterer unntak her. Kan være logg inn i en loggfil. log.warning (ex.getMessage ()); } }

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

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

Trenger du tilgang til stakesporet, og kanskje trekke ut navnet på metoden som forårsaket det?

StringBuilder sbuf = new 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 gjengi det på nytt?

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

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

prøv {... } fangst (java.io. IOException eks) {PrintStream out =...; out.println (ex.getMessage ()); ex.printStackTrace (ut); }

Du kan fange flere typer unntak i en enkelt prøve blokkerer, og utfør spesifikk håndtering for hver type unntak.

prøv {// kaster noen unntak her. } fangst (java.io. IOException eks) {// IOException spesifikk håndtering her. } fangst (java.sql. SQLException eks) {// SQLException spesifikk håndtering her. }

Hvis du vil fange flere unntakstyper, men bruke den samme håndteringskoden, kan du erklære a å fange blokker med flere typer som følger:

prøv {// kaster noen unntak her. } fangst (java.io. IOException | java.sql. SQLException eks) {// IOException og SQLException spesifikk håndtering her. } fangst (SAXException eks) {// SAXException spesifikk håndtering her. }

Rydde opp ressurser med til slutt

Når du arbeider med kode som kan kaste unntak, er det viktig å utføre skikkelig opprydding av ressursene, for eksempel åpnet filer Alt du trenger å vite om filformater og deres egenskaperVi bruker ordfilen om hverandre: musikk, bilde, regneark, lysbildefremvisning og så videre. Men hva gjør en fil til en "fil" likevel? La oss prøve og forstå denne grunnleggende delen av databehandling. Les mer , databaseforbindelser, etc. Ressursopprydding skal utføres i a endelig blokkere. På denne måten påkaller både normal avkjørsel og eksepsjonell avkjørsel fra en blokk oppryddingskode De 10 verste programmeringsfeilene i historienI sin store fortid kodet også smed ødeleggelse. Forekomster av litt dårlig kode forårsaket katastrofe på et stort nivå. Følgende er 10 av de verste programmeringsfeilene i historien. Les mer .

InputStream in = null; prøv {... in = nytt FileInputStream (filnavn);... } fangst (java.io. IOException ex) {log.warning (ex.getMessage ()); } endelig {// -kode her blir kjørt når du avslutter prøveblokken, // enten det er normalt eller på grunn av et unntak hvis (i! = null) in.close (); }

Try-With-Resources-blokkering

Java 1.7 introduserte prøve-med-ressurser konstruere som letter ressursopprydding. Det ser slik ut:

prøv (InputStream i = ny FileInputStream (..)) {// kode som bruker InputStream. }

Når koden kommer ut av blokken (enten det er rent eller på grunn av et unntak), Input variabelen blir automatisk ryddet opp.

Rens opp flere ressurser ved å deklarere dem alle i blokka.

prøv (InputStream i = ny FileInputStream (..); Tilkobling con =...; ) {// kode som bruker InputStream og tilkoblingen. }

Ethvert objekt hvis klasse implementerer AutoCloseable grensesnittet kan ryddes opp på denne måten. Følgende klasse utfører en viss 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øve (MyClass obj = new MyClass (..)) {// kode som bruker MyClass-objektet. }

Noen vanlige møter

La oss nå se på noen vanlige unntak.

  • IndexOutOfBoundsException (ikke avkrysset): indikerer at indeksen for elementet som nås er utenfor grensene for en matrise, streng, etc.
  • SQLException (merket): kastet på grunn av en databasefeil.
  • IOException (merket): filtilgangsfeil eller feil som har med input og output å gjøre.
  • InterruptedException (merket): kastes når en trådutførelse blir avbrutt.
  • SAXException (merket): kastet på grunn av XML-parsingfeil.
  • NullPointerException (ikke avkrysset): bruker null der et objekt er påkrevd.

Pakk inn

Unntak er den viktigste metoden for feilrapportering og styring i Java. Riktig bruk av unntak forbedre kodekvaliteten Skriv eller koder hurtigere i Linux Text Editor med tilpassede temaerLinux-tekstredigereren din trenger ikke å se trøtt ut og "funksjonell." Hvorfor ikke finpusse den for å forbedre produktiviteten din, enten manus og koding eller bruker verktøyet som markeringsredigeringsprogram? Les mer og hjelp til å løse problemer i produksjonen.

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

Bildekreditt: Dmitrij Nikolaev via Shutterstock.com