Frukta fel, men skriv dem inte i Java! Du vet förmodligen redan några saker om undantag i Java . Idag kommer åtminstone en ytlig kunskap att gynna dig. Vi kommer att analysera klassen Error och en speciell undantagstyp som skrämmer många när den dyker upp i deras stackspår.

Överst i Javas undantagshierarki finns Throwable -klassen, som har två ättlingar:

  • Undantag , som ansvarar för fel i ditt program.
  • Och vår hjälte för idag — Error , som är ansvarig för fel i JVM.
    Det är värt att nämna att dessa förmodligen inte ens är kodningsbuggar, utan snarare problem som vanligtvis inte beror på utvecklaren.

Vad ska man göra med ett fel

När du fångar "fel" kan du inte utföra några åtgärder i fångstblocket, förutom att logga , eftersom vi pratar om problem i själva JVM.

Loggning är bra: när du får ett körtidsfel kan du titta på loggarna, se orsaken och veta vad du ska åtgärda.

Eftersom du inte vet vilken typ av fel du kan få när du skriver din kod, är det ingen mening att skriva en viss typ i catch- blocket . Att använda själva klassen Error är inte heller den bästa lösningen, eftersom du i det här fallet bara kommer att fånga fel.

Följaktligen är det bättre att använda klassen Throwable , som kan fånga både Error och Exception . Hur ser detta ut i praktiken?

Det är inte OK att skriva kod så här:

try {
    // Your code
} catch (OutOfMemoryError outOfMemoryError) {
    // Code to catch OutOfMemoryError
}
Att skriva kod så här är inte heller OK:

try {
    // Your code
} catch (Error error) {
    // Code to catch all Errors
}
Men kod som denna är OK:

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

Det andra alternativet för att hantera fel är att kasta dem högre efter att ha deklarerat en kastklausul på metoden. Den här tekniken används när din kod teoretiskt sett kan orsaka ett fel och du vill varna alla som kan använda din kod så att de kan hantera felet korrekt.

Vanliga fel

Några av de mest populära felen är klasserna OutOfMemoryError och StackOverflowError .

OutOfMemoryError dyker ofta upp när programmet inte har tillräckligt med minne för att skapa objekt och sopsamlaren inte kan hänga med. Resultatet är ett OutOfMemoryError .

Java låter dig inte ta bort objekt manuellt för att förhindra minnesläckor, men du kan undvika nedskräpning för att inte överanstränga sophämtaren och inte röra upp högen.

Till exempel kommer kod som denna att skapa mycket skräp i minnet:


while (true) {
    new Object();
}

Det andra felet jag vill berätta om är StackOverflowError , som kastas när stacken svämmar över. Eftersom stacken huvudsakligen lagrar lokala variabler, parametrar och metodanrop, är rekursion (eller ett rekursivt metodanrop) en mycket vanlig orsak till detta fel:


public void foo() {
    foo();
}

För att undvika problem under programkörning varnar moderna IDE:er ofta för att anropa metoder rekursivt.

Du kan inte fixa ett program som kastar fel , men du kan skriva kod som inte ger ett fel och bryter ditt program. Se vad du gör med minnet, skapa objekt noggrant och anropa metoder korrekt. Om du gör det kommer du att ha färre problem med din kod.

Skillnad mellan typerna Error och Exception

Fel Undantag
Kan inte korrigeras i fångstblocket Kan hanteras i ett fångstblock
Förekommer inte vid kompilering Kan fångas vid kompileringstillfället
Problem i JVM Problem med kodlogik
Alla fel är avmarkerade markerad och avmarkerad

Du kan inte undgå undantag i Java, men du ska inte vara rädd för dem. Du behöver bara förstå vad varje typ representerar och veta hur man hanterar det. Det är allt för idag! Vi ses!