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: |
---|
|
Att skriva kod så här är inte heller OK: |
---|
|
Men kod som denna är OK: |
---|
|
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!
GO TO FULL VERSION