Frykt feil, men ikke skriv dem i Java! Du vet sikkert allerede et par ting om unntak i Java . I dag vil i det minste en overfladisk kunnskap komme deg til gode. Vi skal analysere feilklassen og en spesiell unntakstype som skremmer mange når den dukker opp i stabelsporene deres.

På toppen av Javas unntakshierarki er Throwable -klassen, som har to etterkommere:

  • Unntak , som er ansvarlig for feil i programmet ditt.
  • Og helten vår for i dag — Error , som er ansvarlig for feil i JVM.
    Det er verdt å nevne at dette sannsynligvis ikke engang er kodefeil, men snarere problemer som vanligvis ikke er avhengig av utvikleren.

Hva du skal gjøre med en feil

Når du fanger "feil", kan du ikke utføre noen handlinger i catch -blokken, bortsett fra logging , siden vi snakker om problemer i selve JVM.

Logging er bra: når du får en kjøretidsfeil, kan du se på loggene, se årsaken og vite hva du skal fikse.

Siden du ikke vet hva slags feil du kan få når du skriver koden din, gir det ingen mening å skrive en bestemt type i catch- blokken . Å bruke selve Error- klassen er heller ikke den beste løsningen, siden du i dette tilfellet bare vil fange feil.

Følgelig er det bedre å bruke Throwable -klassen, som kan fange både Error og Exception . Hvordan ser dette ut i praksis?

Det er ikke greit å skrive kode slik:

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

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

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

Det andre alternativet for å håndtere feil er å kaste dem høyere etter å ha erklært en kast- klausul på metoden. Denne teknikken brukes når koden din teoretisk sett kan gi en feil og du vil advare alle som kan bruke koden din, slik at de kan håndtere feilen på riktig måte.

Vanlige feil

Noen av de mest populære feilene er OutOfMemoryError- og StackOverflowError -klassene.

OutOfMemoryError vises ofte når programmet ikke har nok minne til å lage objekter og søppelsamleren ikke kan følge med. Resultatet er en OutOfMemoryError .

Java lar deg ikke manuelt slette objekter for å forhindre minnelekkasjer, men du kan unngå forsøpling for ikke å overarbeide søppeloppsamleren og ikke rote til haugen.

For eksempel vil kode som dette skape mye søppel i minnet:


while (true) {
    new Object();
}

Den andre feilen jeg vil fortelle deg om er StackOverflowError , som blir kastet når stabelen renner over. Siden stabelen hovedsakelig lagrer lokale variabler, parametere og metodekall, er rekursjon (eller et rekursivt metodekall) en svært vanlig årsak til denne feilen:


public void foo() {
    foo();
}

For å unngå problemer under programkjøring, advarer moderne IDE-er ofte om anropsmetoder rekursivt.

Du kan ikke fikse et program som kaster feil , men du kan skrive kode som ikke vil gi feil og ødelegge programmet ditt. Se hva du gjør med hukommelsen, lag objekter nøye, og kall metoder på riktig måte. Hvis du gjør det, vil du ha færre problemer i koden din.

Forskjellen mellom typene feil og unntak

Feil Unntak
Kan ikke korrigeres i fangblokk Kan håndteres i fangblokk
Oppstår ikke på kompileringstidspunktet Kan fanges på kompileringstidspunktet
Problemer i JVM Problemer med kodelogikk
Alle feil er ikke merket avmerket og ukontrollert

Du kan ikke unnslippe unntak i Java, men du bør ikke være redd for dem. Du trenger bare å forstå hva hver type representerer og vite hvordan du skal håndtere det. Det var alt for i dag! Ser deg!