Frygt fejl, men skriv dem ikke i Java! Du ved sikkert allerede et par ting om undtagelser i Java . I dag vil i det mindste en overfladisk viden gavne dig. Vi skal analysere fejlklassen og en særlig undtagelsestype, der skræmmer mange mennesker, når den dukker op i deres stakspor.

Øverst i Javas undtagelseshierarki er Throwable -klassen, som har to efterkommere:

  • Undtagelse , som er ansvarlig for fejl i dit program.
  • Og vores helt for i dag — Error , som er ansvarlig for fejl i JVM.
    Det er værd at nævne, at disse sandsynligvis ikke engang er kodefejl, men snarere problemer, der normalt ikke afhænger af udvikleren.

Hvad skal man gøre med en fejl

Når du fanger "fejl", kan du ikke udføre nogen handlinger i catch -blokken, undtagen logning , da vi taler om problemer i selve JVM'en.

Logning er god: Når du får en runtime-fejl, kan du se på logfilerne, se årsagen og vide, hvad du skal rette.

Da du ikke ved, hvilken slags fejl du kan få, når du skriver din kode, giver det ingen mening at skrive en bestemt type i catch- blokken . At bruge selve Error- klassen er heller ikke den bedste løsning, da du i dette tilfælde kun vil fange fejl.

Derfor er det bedre at bruge Throwable -klassen, som kan fange både Error og Exception . Hvordan ser det ud i praksis?

Det er ikke i orden at skrive kode som denne:

try {
    // Your code
} catch (OutOfMemoryError outOfMemoryError) {
    // Code to catch OutOfMemoryError
}
At skrive kode som denne er heller ikke OK:

try {
    // Your code
} catch (Error error) {
    // Code to catch all Errors
}
Men kode som denne er OK:

try {
    // Your code
} catch (Throwable throwable) {
    // Code to catch all Throwables
}

Den anden mulighed for håndtering af fejl er at kaste dem højere efter at have erklæret en kast- klausul på metoden. Denne teknik bruges, når din kode teoretisk set kan give en fejl, og du vil advare alle, der kan bruge din kode, så de kan håndtere fejlen korrekt.

Almindelige fejl

Nogle af de mest populære fejl er klasserne OutOfMemoryError og StackOverflowError .

OutOfMemoryError dukker ofte op, når programmet ikke har nok hukommelse til at oprette objekter, og skraldeopsamleren ikke kan følge med. Resultatet er en OutOfMemoryError .

Java tillader dig ikke manuelt at slette objekter for at forhindre hukommelseslækager, men du kan undgå henkastning for ikke at overanstrenge skraldeopsamleren og ikke rod i dyngen.

For eksempel vil kode som denne skabe en masse affald i hukommelsen:


while (true) {
    new Object();
}

Den anden fejl, jeg vil fortælle dig om, er StackOverflowError , som kastes, når stakken løber over. Da stakken hovedsageligt gemmer lokale variabler, parametre og metodekald, er rekursion (eller et rekursivt metodekald) en meget almindelig årsag til denne fejl:


public void foo() {
    foo();
}

For at undgå problemer under programafvikling advarer moderne IDE'er ofte om at kalde metoder rekursivt.

Du kan ikke rette et program, der kaster fejl , men du kan skrive kode, der ikke vil kaste en fejl og ødelægge dit program. Se, hvad du gør med hukommelsen, opret objekter omhyggeligt, og kald metoder korrekt. Hvis du gør det, vil du have færre problemer i din kode.

Forskellen mellem fejl- og undtagelsestyperne

Fejl Undtagelse
Kan ikke rettes i fangeblok Kan håndteres i en fangblok
Forekommer ikke på kompileringstidspunktet Kan fanges på kompileringstidspunktet
Problemer i JVM Problemer med kodelogik
Alle fejl er ikke markeret kontrolleret og ukontrolleret

Du kan ikke undslippe undtagelser i Java, men du skal ikke være bange for dem. Du skal bare forstå, hvad hver type repræsenterer og vide, hvordan du håndterer det. Det var alt for i dag! Vi ses!