Reklame

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

  • Manglende åbning af en konfigurationsfil kan bedre håndteres højere op i koden, måske ved at bruge en alternativ konfigurationsfilplacering.
  • Adgang til en array element Sådan bruges en Java ArrayListEn Java-arraylist er en array med generel anvendelse, 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. Læs mere uden for arrayets grænser betyder en programfejl. Glad 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 du behandler en stor fil) kan korrigeres 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 genereres, så den underliggende årsag kan løses.

instagram viewer

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 Fejlpå den anden side er til indikation af alvorlige fejl i Java-runtime-miljøet, som applikationer ikke skal fange. Nogle eksempler er: OutOfMemoryError og StackOverflowError.

Undtagelseshierarki

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 på den anden side sprede sig 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 heller ikke gør det.

privat tomrum loadFile (strengnavn) {FileReader i = ny 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 = ny FileReader (filnavn)); {} fangst (FileNotFoundException ex) {// håndterer undtagelse her} }

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

privat tomrum loadFile (strengnavn) kaster java.io. FileNotFoundException. {FileReader i = ny 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 markerede og ikke-markerede undtagelser ser det ud til, at det er lettere at håndtere ikke-markerede 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 {... kaste ny SQLException; }

Når denne metode påberåbes fra en anden metode (method_2 ()), kan denne metode fange SQLException og pak det 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 metodeindkaldelse, der er 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 til at spore rækkefølgen af ​​opkald tilbage der forårsagede fejlen Java-undtagelser: Håndterer du dem rigtigt?En undtagelse i programmering betyder en ekstraordinær betingelse i programudførelsen. Den bruges, når betingelsen kan håndteres andetsteds. Overvej følgende eksempler på håndtering af Java-undtagelser. Læs mere .

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

Undtagelse 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)

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

Håndtering af undtagelser

En undtagelse kan håndteres ved at fange den i en try-catch 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å den metode, 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 tilbage?

prøve {... } 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øve {... } 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. } fangst (java.sql. SQLException ex) {// SQLException-specifik håndtering her. }

For at fange flere undtagelsestyper, men bruge den samme håndteringskode, kan du erklære en 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 håndterer kode, der kan kaste undtagelser, er det vigtigt at udføre korrekt oprydning af ressourcer, såsom åbne filer Alt hvad du behøver at vide om filformater og deres egenskaberVi bruger ordfilen om hverandre: 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. Læs mere , databaseforbindelser osv. Ressourceoprydning skal udføres i a endelig blok. På denne måde påkaldes både normal udgang og usædvanlig udgang fra en blok oprydningskode De 10 værste programmeringsfejl i historienI sin fortorkede 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. Læs mere .

InputStream in = null; prøve {... in = nyt FileInputStream (filnavn);... } fangst (java.io. IOException ex) {log.warning (ex.getMessage ()); } endelig {// -kode her udføres ved afslutning af try-blok, // 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 blokken.

prøv (InputStream i = nyt 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 forbedre kodekvaliteten Skriv eller kode hurtigere i din Linux-teksteditor med brugerdefinerede temaerDin Linux-teksteditor behøver ikke at se træt 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? Læs mere 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