
Joseph Goodman
0
2360
656
Som programmerende nybegynder Sådan læres programmering uden al stress Sådan læres programmering uden al den stress Måske har du besluttet at fortsætte programmering, hvad enten det drejer sig om en karriere eller bare som en hobby. Store! Men måske begynder du at blive overvældet. Ikke så stor. Her er hjælp til at lette din rejse. , begrebet undtagelse håndtering kan være hårdt at vikle dit hoved rundt. Ikke at selve konceptet er vanskeligt, men terminologien kan få det til at virke mere avanceret end det er. Og det er en så kraftig funktion, at det er tilbøjelig til misbrug og misbrug.
I denne artikel lærer du, hvad undtagelser er, hvorfor de er vigtige, hvordan man bruger dem og almindelige fejl, der skal undgås. Mest moderne sprog 6 nemmeste programmeringssprog at lære for begyndere 6 Nemmeste programmeringssprog at lære for begyndere At lære at programmere handler om at finde det rigtige sprog lige så meget som det handler om opdateringsprocessen. Her er de seks mest nemmeste programmeringssprog for begyndere. har en slags undtagelseshåndtering, så hvis du nogensinde går videre fra Java 7 Nyttige tricks til at mestre et nyt programmeringssprog 7 Nyttige tricks til at mestre et nyt programmeringssprog Det er okay at blive overvældet, når du lærer at kode. Du vil sandsynligvis glemme tingene så hurtigt, som du lærer dem. Disse tip kan hjælpe dig med at bevare alle de nye oplysninger bedre. , kan du tage de fleste af disse tip med dig.
Forståelse af Java-undtagelser
I Java, en undtagelse er et objekt, der angiver noget unormalt (eller “enestående”) forekom under din applikations kørsel. Sådanne undtagelser er kastet, hvilket dybest set betyder, at der oprettes et undtagelsesobjekt (svarer til, hvordan fejl er “hævet”).
Skønheden er, at du kan fangst kastede undtagelser, som giver dig mulighed for at håndtere den unormale tilstand og lade din ansøgning fortsætte med at køre, som om intet gik galt. For eksempel, hvorimod en nulpunkt i C kan ødelægge din applikation, giver Java dig mulighed for at kaste og fange NullPointerException
s før en nullvariabel har en chance for at forårsage et nedbrud.
Husk, en undtagelse er bare et objekt, men med en vigtig egenskab: den skal udvides fra Undtagelse
klasse eller en hvilken som helst underklasse af Undtagelse
. Mens Java har alle slags indbyggede undtagelser, kan du også oprette dine egne, hvis du ønsker det. Nogle af de mest almindelige Java-undtagelser inkluderer:
NullPointerException
NumberFormatException
IllegalArgumentException
RuntimeException
IllegalStateException
Så hvad sker der, når du kaster en undtagelse?
Først ser Java inden for den øjeblikkelige metode for at se, om der er kode, der håndterer den slags undtagelse, du kastede. Hvis der ikke findes en håndterer, ser den på den metode, der kaldte den aktuelle metode for at se, om der findes et håndtag der. Hvis ikke, ser det på den metode, der kaldes at metode, og derefter den næste metode osv. Hvis undtagelsen ikke fanges, udskriver applikationen en stakespor og går ned. (Det er faktisk mere nuanceret end blot at gå ned, men det er et avanceret emne uden for denne artikels rækkevidde.)
EN stak spor er en liste over alle de metoder, som Java gennemgik, mens han ledte efter en undtagelseshåndterer. Sådan ser en stakespor ud:
Undtagelse i tråd "hoved" 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 meget ud af dette. For det første var den kastede undtagelse a NullPointerException
. Det fandt sted i getTitle ()
metode på linje 16 i Book.java. Denne metode blev kaldt fra getBookTitles ()
på linje 25 af Author.java. At metode blev kaldt fra main ()
på linje 14 i Bootstrap.java. Som du kan se, gør det lettere at debugging ved at kende alt dette.
Men igen er den sande fordel ved undtagelser, at du kan “håndtere” den unormale tilstand ved at fange undtagelsen, indstille tingene rigtigt og genoptage applikationen uden at gå ned.
Brug af Java-undtagelser i kode
Lad os sige, at du har det someMethod ()
der tager et heltal og udfører en vis logik, der kan bryde, hvis heltalet er mindre end 0 eller større end 100. Dette kan være et godt sted at kaste en undtagelse:
public void someMethod (int-værdi) if (værdi 100) kast nyt IllegalArgumentException
(); //…
For at fange denne undtagelse skal du gå til hvor someMethod ()
kaldes og brug try-catch-blok:
public void callingMethod () prøv someMethod (200); someOtherMethod (); fangst (IllegalArgumentException e) // håndter undtagelsen heri //…
Alt inden for prøve blokering køres i rækkefølge, indtil en undtagelse kastes. Så snart en undtagelse kastes, springes alle efterfølgende udsagn over, og applikationslogikken springer straks til fangst blok.
I vores eksempel indtaster vi trykblokken og ringer straks op someMethod ()
. Da 200 ikke er mellem 0 og 100, an IllegalArgumentException
kastes. Dette afslutter straks udførelsen af someMethod ()
, springer resten af logikken over i prøveblokken (someOtherMethod ()
kaldes aldrig), og genoptager udførelsen inden for fangstblokken.
Hvad ville der ske, hvis vi ringede someMethod (50)
i stedet? Det IllegalArgumentException
ville aldrig blive kastet. someMethod ()
ville udføre som normalt. Trykblokken udføres som normalt ved at ringe op someOtherMethod ()
når someMethod () afsluttes. Hvornår someOtherMethod ()
ender, vil fangstblokken blive sprunget over og callingMethod ()
ville fortsætte.
Bemærk, at du kan have flere fangstblokke pr. Prøveblok:
public void callingMethod () prøv someMethod (200); someOtherMethod (); fangst (IllegalArgumentException e) // håndterer undtagelsen her fangst (NullPointerException e) // håndterer undtagelsen her // ...
Bemærk også, at et valgfrit langt om længe der findes også blok:
offentlig tommetode () prøv //… fangst (undtagelse e) //… endelig //…
Koden inden for en endelig blok er altid henrettet uanset hvad. Hvis du har en returnering i forsøgsblokken, udføres den endelige blok, før du vender tilbage fra metoden. Hvis du kaster en anden undtagelse i fangstblokken, udføres den endelige blok, før undtagelsen kastes.
Du skal bruge den endelige blok, når du har objekter, der skal ryddes op, før metoden slutter. Hvis du f.eks. Åbnede en fil i prøveblokken og senere kastede en undtagelse, giver den endelige blok dig mulighed for at lukke filen, før du forlader metoden.
Bemærk, at du kan have en endelig blok uden en fangstblok:
metode til offentlig annullering () prøv //… endelig //…
Dette giver dig mulighed for at udføre enhver nødvendig oprydning, mens du tillader kastede undtagelser at sprede op til metodeinvokationsstakken (dvs. du vil ikke håndtere undtagelsen her, men du skal stadig rydde op først).
Kontrolleret vs. ikke-markerede undtagelser i Java
I modsætning til de fleste sprog, skelner Java mellem kontrollerede undtagelser og ikke-markerede undtagelser (f.eks. har C # kun ikke-markerede undtagelser). En kontrolleret undtagelse skal blive fanget i metoden, hvor undtagelsen kastes, ellers koden ikke kompileres.
For at oprette en markeret undtagelse skal du forlænge fra Undtagelse
. For at oprette en ikke-markeret undtagelse skal du forlænge fra RuntimeException
.
Enhver metode, der kaster en markeret undtagelse, skal angive dette i metodesignaturen ved hjælp af kaster søgeord. Siden Java's indbyggede IOException
er en markeret undtagelse, den følgende kode vil ikke blive samlet:
public void wontCompile () //… if (someCondition) throw new IOException (); //…
Du skal først erklære, at det kaster en kontrolleret undtagelse:
public void willCompile () kaster IOException //… hvis (someCondition) throw new IOException (); //…
Bemærk, at en metode kan erklæres som en undtagelse, men aldrig en undtagelse. Alligevel skal undtagelsen stadig fanges, ellers koden ikke kompileres.
Hvornår skal du bruge markerede eller ikke-markerede undtagelser?
Den officielle Java-dokumentation har en side om dette spørgsmål. Det opsummerer forskellen med en kortfattet tommelfingerregel: “Hvis en klient med rimelighed kan forventes at komme sig fra en undtagelse, skal du gøre den til en kontrolleret undtagelse. Hvis en klient ikke kan gøre noget for at komme sig fra undtagelsen, skal du gøre det til en ikke-markeret undtagelse.”
Men denne retningslinje kan være forældet. På den ene side resulterede afkrydsede undtagelser i mere robust kode 10 tip til at skrive renere og bedre kode 10 tip til at skrive renere og bedre kode At skrive ren kode ser lettere ud, end det faktisk er, men fordelene er det værd. Her er, hvordan du kan begynde at skrive renere kode i dag. . På den anden side har intet andet sprog kontrolleret undtagelser på samme måde som Java, der viser to ting: en, funktionen er ikke nyttig nok til, at andre sprog kan stjæle det, og to, du kan absolut leve uden dem. Desuden spiller afkrydsede undtagelser ikke pænt med lambda-udtryk introduceret i Java 8.
Retningslinjer for anvendelse af Java-undtagelser
Undtagelser er nyttige, men misbruges og misbruges let. Her er et par tip og bedste praksis, der hjælper dig med at undgå at gøre noget ved dem.
- Foretrækker specifikke undtagelser frem for generelle undtagelser. Brug
NumberFormatException
overIllegalArgumentException
når det er muligt, brug ellersIllegalArgumentException
overRuntimeException
når det er muligt. - Fang aldrig
Throwable
! DetUndtagelse
klassen strækker sig faktiskThrowable
, og fangstblokken fungerer faktisk medThrowable
eller enhver klasse, der strækker sig med kaste. DogFejl
klassen udvides ogsåThrowable
, og du vil aldrig fange enFejl
fordiFejl
s angiver alvorlige uoprettelige problemer. - Fang aldrig
Undtagelse
!InterruptedException
udviderUndtagelse
, så enhver blok, der fangerUndtagelse
vil også fangeInterruptedException
, og det er en meget vigtig undtagelse, som du ikke ønsker at rod med (især i multitrådede applikationer), medmindre du ved, hvad du laver. Hvis du ikke ved, hvilken undtagelse du skal fange i stedet, skal du overveje at ikke fange noget. - Brug beskrivende meddelelser for at lette debugging. Når du kaster en undtagelse, kan du angive en
Snor
besked som et argument. Denne meddelelse kan fås i fangstblokken ved hjælp afException.getMessage ()
metode, men hvis undtagelsen aldrig fanges, vises meddelelsen også som en del af stakesporet. - Prøv ikke at fange og ignorere undtagelser. For at omgå besværet med kontrollerede undtagelser, vil en masse nybegynder og doede programmerere oprette en fangstblok men lader den være tom. Bad! Håndter altid det yndefuldt, men hvis du ikke kan, skal du i det mindste udskrive en stakespor, så du ved, at undtagelsen blev kastet. Du kan gøre dette ved hjælp af
Exception.printStackTrace ()
metode. - Pas på at overforbrug undtagelser. Når du har en hammer, ser alt ud som en søm. Når du først lærer om undtagelser, kan du føle dig forpligtet til at omdanne alt til en undtagelse ... til det punkt, hvor det meste af din applikations kontrolstrøm kommer til undtagelseshåndtering. Husk, undtagelser er beregnet til “enestående” forekomster!
Nu skal du være komfortabel nok med undtagelser til at forstå, hvad de er, hvorfor de bruges, og hvordan du kan integrere dem i din egen kode. Hvis du ikke fuldt ud forstår konceptet, er det okay! Det tog mig et stykke tid, før det gjorde det “klik” i mit hoved, så føl ikke, at du har brug for at skynde dig 6 tegn på, at du ikke har ment at være programmør, 6 tegn på, at du ikke har til hensigt at være programmør. Ikke alle er udskåret til at være en programmør. Hvis du ikke er helt sikker på, at du er beregnet til at være programmør, er her nogle tegn, der kan pege dig i den rigtige retning. . Tag dig god tid.
Har du spørgsmål? Kender du til andre undtagelsesrelaterede tip, som jeg har savnet? Del dem i kommentarerne herunder!