Slik håndterer du Java-unntak på riktig måte

Slik håndterer du Java-unntak på riktig måte / programmering

Som en programmering newbie Slik lærer du programmering uten all stress Slik lærer du programmering uten all stress Kanskje du har bestemt deg for å forfølge programmering, enten for en karriere eller bare som en hobby. Flott! Men kanskje du begynner å føle deg overveldet. Ikke så bra. Her er hjelp til å lette reisen din. Les mer, konseptet av avvikshåndtering kan være vanskelig å vikle hodet rundt. Ikke at selve konseptet er vanskelig, men terminologien kan gjøre det virke mer avansert enn det er. Og det er så kraftig at den er utsatt for misbruk og misbruk.

I denne artikkelen lærer du hvilke unntak, hvorfor de er viktige, hvordan du bruker dem, og vanlige feil å unngå. Mest moderne språk 6 enkleste programmeringsspråk å lære for nybegynnere 6 enkleste programmeringsspråk å lære for nybegynnere Lære å programmere handler om å finne det riktige språket like mye som det handler om oppbyggingsprosessen. Her er de seks beste programmeringsspråket for nybegynnere. Les mer har noen form for unntakshåndtering, så hvis du noen gang går videre fra Java 7 Nyttige triks for å mestre et nytt programmeringsspråk 7 Nyttige triks for å mestre et nytt programmeringsspråk Det er greit å være overveldet når du lærer å kode. Du vil sikkert glemme ting så fort du lærer dem. Disse tipsene kan hjelpe deg å bedre beholde all den nye informasjonen. Les mer, du kan ta de fleste av disse tipsene med deg.

Forståelse av Java-unntak

I Java, en unntak er et objekt som indikerer noe unormalt (eller “eksepsjonell”) skjedde under søknadens løp. Slike unntak er kastet, som i utgangspunktet betyr at et unntaksobjekt er opprettet (ligner på hvordan feil er “oppvokst”).

Skjønnheten er det du kan å fange kastet unntak, som lar deg håndtere unormal tilstand og la applikasjonen fortsette å løpe som om ingenting gikk galt. For eksempel, mens en nullpeker i C kan krasje programmet, lar Java deg kaste og fange NullPointerExceptions før null-variabel har en sjanse til å forårsake et krasj.

Husk, et unntak er bare et objekt, men med en viktig egenskap: det må utvides fra Unntak klasse eller noen underklasse av Unntak. Mens Java har alle typer innebygde unntak, kan du også lage din egen hvis du ønsker det. Noen av de vanligste Java-unntakene inkluderer:

  • NullPointerException
  • NumberFormatException
  • IllegalArgumentException
  • RuntimeException
  • IllegalStateException

Så hva skjer når du kaster et unntak?

For det første ser Java ut i den umiddelbare metoden for å se om det er kode som håndterer det unntaket du kastet. Hvis en handler ikke eksisterer, ser det på metoden som kalte den gjeldende metoden for å se om et håndtak eksisterer der. Hvis ikke, ser det på metoden som ringte at metode, og deretter den neste metoden, osv. Hvis unntaket ikke er tatt, skriver applikasjonen en stakkspor og krasjer deretter. (Faktisk er det mer nyansert enn bare å krasje, men det er et avansert tema utenfor dette artiklens omfang.)

EN stakk spor er en liste over alle metodene som Java traverserte mens de lette etter en unntakshåndterer. Her ser du hvordan en stablingsspor ser ut:

Unntak i tråden "main" java.lang.NullPointerException på com.example.myproject.Book.getTitle (Book.java:16) på com.example.myproject.Author.getBookTitles (Author.java:25) på com.example. myproject.Bootstrap.main (Bootstrap.java:14)

Vi kan hente mye av dette. For det første var det kastede unntaket a NullPointerException. Det skjedde i getTitle () metode på linje 16 av Book.java. Denne metoden ble kalt fra getBookTitles () på linje 25 av Author.java. At Metoden ble kalt fra hoved() på linje 14 i Bootstrap.java. Som du kan se, er det enklere å kjenne alt dette.

Men igjen, den sanne fordelen med unntak er at du kan “håndtak” den unormale tilstanden ved å fange unntaket, sette ting riktig, og gjenoppta søknaden uten å krasje.

Bruke Java-unntak i kode

La oss si at du har someMethod () som tar et heltall og utfører noen logikk som kan bryte hvis heltallet er mindre enn 0 eller høyere enn 100. Dette kan være et godt sted å kaste unntak:

offentlig tomt noenMetode (int verdi) hvis (verdi < 0 || value > 100) Kast nytt IllegalArgumentException();  // //

For å fange dette unntaket må du gå til hvor someMethod () kalles og bruker try-catch blokk:

Offentlig tomgangskallMethod () prøv someMethod (200); someOtherMethod ();  fangst (IllegalArgumentException e) // håndtere unntaket her // ...

Alt innenfor prøve blokk vil utføres i rekkefølge til et unntak er kastet. Så snart et unntak kastes, hoppes alle påfølgende setninger og applikasjonslogikken hopper umiddelbart til å fange blokkere.

I vårt eksempel går vi inn i prøveblokken og ringer umiddelbart someMethod (). Siden 200 ikke er mellom 0 og 100, an IllegalArgumentException er kastet. Dette avsluttes umiddelbart med kjøring av someMethod (), hopper over resten av logikken i forsøksblokken (someOtherMethod () blir aldri kalt), og fortsetter kjøring i fangstblokken.

Hva ville skje hvis vi ringte someMethod (50) i stedet? De IllegalArgumentException ville aldri bli kastet. someMethod () ville utføre som normalt. Prøveblokken vil utføres som vanlig, ringer someOtherMethod () når someMethod () fullfører. Når someOtherMethod () slutter, fangstblokken vil bli hoppet over og callingMethod () ville fortsette.

Merk at du kan ha flere fangstblokker pr. Prøveblokk:

Offentlig tomgangskallMethod () prøv someMethod (200); someOtherMethod ();  fangst (IllegalArgumentException e) // håndtere unntaket her fange (NullPointerException e) // håndtere unntaket her // ...

Legg også merke til at en valgfri endelig Blokken eksisterer også:

offentlig tomrommetode () prøv // ... fange (unntak e) // ... til slutt // ...

Koden i en endelig blokk er alltid utført uansett hva. Hvis du har en returmelding i forsøksblokken, blir sluttblokken utført før du går ut av metoden. Hvis du kaster et annet unntak i fangstblokken, blir sluttblokken utført før unntaket kastes.

Du bør bruke den endelige blokk når du har objekter som må ryddes opp før metoden avsluttes. Hvis du for eksempel åpnet en fil i forsøksblokken og senere kastet et unntak, lar sluttkvarteret lukke filen før du forlater metoden..

Legg merke til at du kan få en endelig blokk uten en fangstblokk:

offentlig tomrommetode () prøv // ... til slutt // ...

Dette gjør at du kan gjøre nødvendig opprydding mens du tillater kastet unntak for å formidle metoden for innkallingsbunken (det vil si at du ikke vil håndtere unntaket her, men du må fortsatt rydde opp først).

Sjekket vs. Ukontrollerte unntak i Java

I motsetning til de fleste språk, skiller Java mellom sjekket unntak og ukontrollerte unntak (for eksempel har C # bare ukontrollerte unntak). Et kontrollert unntak bli fanget i metoden der unntaket kastes, ellers vil koden ikke kompilere.

For å opprette et kontrollert unntak, strekk fra Unntak. For å lage et ukontrollert unntak, strekk fra RuntimeException.

Enhver metode som kaster et kontrollert unntak, må angi dette i metode signaturen ved hjelp av kaster søkeord. Siden Java er innebygd IOException er et kontrollert unntak, vil følgende kode ikke kompilere:

offentlig tomt wontCompile () // ... if (someCondition) kaste ny IOException ();  // //

Du må først erklære at det kaster et kontrollert unntak:

offentlig tomgang willCompile () kaster IOException // ... if (someCondition) kaste ny IOException ();  // //

Legg merke til at en metode kan deklareres som å kaste et unntak, men aldri faktisk kaste unntak. Likevel vil unntaket fortsatt bli fanget, ellers vil koden ikke kompilere.

Når skal du bruke merkede eller ukontrollerte unntak?

Den offisielle Java-dokumentasjonen har en side om dette spørsmålet. Det oppsummerer forskjellen med en kortfattet tommelfingerregel: “Hvis en klient med rimelighet kan forventes å gjenopprette fra et unntak, gjør det et kontrollert unntak. Hvis en klient ikke kan gjøre noe for å gjenopprette fra unntaket, gjør det til et ukontrollert unntak.”

Men denne retningslinjen kan være utdatert. På den ene side resulterer sjekkede unntak i mer robust kode 10 Tips for å skrive renere og bedre kode 10 Tips for å skrive renere og bedre kode Skrive ren kode ser enklere ut enn det egentlig er, men fordelene er verdt det. Slik kan du begynne å skrive renere kode i dag. Les mer . På den annen side har ingen andre språk kontrollert unntak på samme måte som Java, som viser to ting: en, funksjonen er ikke nyttig nok til at andre språk stjeler det, og to, du kan absolutt leve uten dem. Pluss, sjekkede unntak spiller ikke pent med lambda-uttrykk som er introdusert i Java 8.

Retningslinjer for bruk av Java-unntak

Unntak er nyttige, men misbrukt og misbrukt. Her er noen tips og gode fremgangsmåter for å hjelpe deg med å unngå å gjøre et rot av dem.

  • Foretrekker spesifikke unntak fra generelle unntak. Bruk NumberFormatException over IllegalArgumentException når det er mulig, bruk ellers IllegalArgumentException over RuntimeException når mulig.
  • Fang aldri Throwable! De Unntak klassen strekker seg faktisk ut Throwable, og fangstblokken fungerer faktisk med Throwable eller hvilken som helst klasse som strekker seg. Imidlertid Feil klassen strekker seg også ut Throwable, og du vil aldri fange en Feil fordi Feils indikerer alvorlige uopprettelige problemer.
  • Fang aldri Unntak! InterruptedException strekker Unntak, så noen blokk som fanger Unntak vil også fange InterruptedException, og det er et svært viktig unntak som du ikke vil rote med (spesielt i multi-threaded applikasjoner) med mindre du vet hva du gjør. Hvis du ikke vet hvilket unntak å fange i stedet, bør du ikke vurdere å fange noe.
  • Bruk beskrivende meldinger for å lette feilsøking. Når du kaster et unntak, kan du gi en string melding som et argument. Denne meldingen kan nås i fangstblokken ved hjelp av Exception.getMessage () metode, men hvis unntaket aldri blir fanget, vil meldingen også vises som en del av stakkesporingen.
  • Prøv å ikke fange og ignorere unntak. For å komme seg over ulempene med sjekket unntak, vil mange nybegynnere og dovne programmerere sette opp en fangstblokk, men la den være tom. Bad! Behandle alltid det grasiøst, men hvis du ikke kan, skriv i det minste ut en stakkspor slik at du vet at unntaket ble kastet. Du kan gjøre dette ved hjelp av Exception.printStackTrace () metode.
  • Pass opp for overusing unntak. Når du har en hammer, ser alt ut som et negle. Når du først lærer om unntak, kan du føle deg tvunget til å gjøre alt til et unntak ... til det punktet hvor mesteparten av søknadens kontrollflyt kommer ned til unntakshåndtering. Husk at unntak er ment for “eksepsjonell” forekomster!

Nå bør du være komfortabel nok med unntak for å forstå hva de er, hvorfor de er brukt, og hvordan å innlemme dem i din egen kode. Hvis du ikke forstår konseptet fullt ut, er det greit! Det tok meg en stund for det “klikk” i hodet mitt, så ikke føler at du trenger å skynde det 6 Tegn på at du ikke er ment å være programmerer 6 Tegn på at du ikke er ment å være programmerer Ikke alle er kuttet ut til å være programmerer. Hvis du ikke er helt sikker på at du er ment å være programmerer, er det noen tegn som kan vise deg i riktig retning. Les mer . Ta den tiden du trenger.

Har du noen spørsmål? Vet du om andre unntaksrelaterte tips som jeg savnet? Del dem i kommentarene nedenfor!

Utforsk mer om: Java.