1. Få ett stack trace
Programmeringsspråket Java erbjuder många sätt för en programmerare att få information om vad som händer i ett program. Och inte bara ord.
Till exempel, efter att C++-program har kompilerats, blir de en stor fil full av maskinkod, och allt som är tillgängligt för en programmerare vid körning är adressen till minnesblocket som innehåller maskinkoden som för närvarande exekveras. Inte mycket, låt oss säga.
Men för Java, även efter att ett program har kompilerats, förblir klasser klasser, metoder och variabler försvinner inte, och programmeraren har många sätt att få information om vad som händer i programmet.
Stack spår
Till exempel, vid ett programs körning, kan du ta reda på klassen och namnet på metoden som körs för närvarande. Och inte bara en metod - du kan få information om hela kedjan av metodanrop från den aktuella metoden tillbaka till metoden main()
.
En lista som består av den aktuella metoden, och metoden som anropade den, och metod som anropade den, etc. kallas stack trace . Du kan få det med detta uttalande:
StackTraceElement[] methods = Thread.currentThread().getStackTrace();
Du kan också skriva det som två rader:
Thread current = Thread.currentThread();
StackTraceElement[] methods = current.getStackTrace();
Klassens statiska currentThread()
metod Thread
returnerar en referens till ett Thread
objekt, som innehåller information om den aktuella tråden, dvs den aktuella exekveringstråden. Du kommer att lära dig mer om trådar på nivåerna 17 och 18 i Java Core -uppdraget.
Detta Thread
objekt har en getStackTrace()
metod som returnerar en array av StackTraceElement
objekt, som vart och ett innehåller information om en metod. Tillsammans bildar alla dessa element ett stackspår .
Exempel:
Koda |
---|
|
Konsolutgång |
|
Som vi kan se i exemplets konsolutgång getStackTrace()
returnerade metoden en array med tre element:
getStackTrace()
Thread
klassens metodtest()
Main
klassens metodmain()
Main
klassens metod
Från denna stackspårning kan vi dra slutsatsen att:
- Metoden
Thread.getStackTrace()
anropades avMain.test()
metoden på rad 11 i filen Main.java - Metoden
Main.test()
anropades avMain.main()
metoden på rad 5 i filen Main.java - Ingen kallade
Main.main()
metoden - detta är den första metoden i kedjan av samtal.
Förresten, bara en del av den tillgängliga informationen visades på skärmen. Allt annat kan erhållas direkt från StackTraceElement
objektet
2.StackTraceElement
Som namnet antyder StackTraceElement
skapades klassen för att lagra information om ett stackspårelement , dvs en metod i stack trace
.
Den här klassen har följande instansmetoder:
Metod | Beskrivning |
---|---|
|
Returnerar namnet på klassen |
|
Returnerar namnet på metoden |
|
Returnerar namnet på filen (en fil kan innehålla flera klasser) |
|
Returnerar radnumret i filen där metoden anropades |
|
Returnerar namnet på modulen (detta kan vara null ) |
|
Returnerar versionen av modulen (detta kan vara null ) |
De kan hjälpa dig att få mer fullständig information om den aktuella samtalsstacken:
Koda | Konsolutgång | Notera |
---|---|---|
|
|
klassnamn metodnamn filnamn radnummer modulnamn modulversion klassnamn metodnamn filnamn radnummer modulnamn modulversion klassnamn metodnamn filnamn radnummer modulnamn modulversion |
3. Stapla
Du vet redan vad en stackspårning är, men vad är en stack (stackklass)?
En stack är en datastruktur som du kan lägga till element i och från vilken du kan hämta element. Genom att göra det kan du bara ta element från slutet: du tar först det sista som lades till, sedan det näst sista som lades till osv.
Själva namnstacken antyder detta beteende, som hur du skulle interagera med en hög med papper. Om du lägger ark 1, 2 och 3 i en stapel måste du hämta dem i omvänd ordning: först det tredje arket, sedan det andra och först sedan det första.
Java har till och med en speciell stacksamlingsklass med samma namn och beteende. Den här klassen delar många beteenden med ArrayList
och LinkedList
. Men den har också metoder som implementerar stackbeteende:
Metoder | Beskrivning |
---|---|
|
Lägger till obj elementet överst i stacken |
|
Tar elementet från toppen av stapeln (stapeldjupet minskar) |
|
Returnerar objektet överst i stapeln (stacken ändras inte) |
|
Kontrollerar om samlingen är tom |
|
Söker efter ett objekt i samlingen och returnerar dessindex |
Exempel:
Koda | Högens innehåll (högst upp på högen är till höger) |
---|---|
|
|
Stackar används ganska ofta i programmering. Så det här är en användbar samling.
4. Visar ett stackspår under undantagshantering
Varför kallas en lista med metodanrop en stackspårning ? För om du tänker på listan med metoder som en bunt med pappersark med metodnamn, då när du anropar nästa metod lägger du till ett ark med den metodens namn till bunten. Och nästa pappersark går ovanpå det, och så vidare.
När en metod slutar tas arket överst i stapeln bort. Du kan inte ta bort ett ark från mitten av högen utan att ta bort alla ark ovanför det. På samma sätt kan du inte avsluta en metod mitt i en kedja av samtal utan att avsluta alla metoder som den har anropat.
Undantag
En annan intressant användning för stackar är under undantagshantering.
När ett fel inträffar i ett program och ett undantag kastas innehåller undantaget den aktuella stackspårningen — en array som består av en lista med metoder som börjar , från huvudmetoden och slutar med metoden där felet inträffade. Det finns till och med linjen där undantaget kastades!
Denna stackspårning lagras i undantaget och kan enkelt hämtas från den med följande metod:StackTraceElement[] getStackTrace()
Exempel:
Koda | Notera |
---|---|
|
Fånga undantaget Hämta stackspårningen som fanns när felet uppstod. |
Detta är en metod i Throwable
klassen, så alla dess ättlingar (dvs alla undantag) har metoden getStackTrace()
. Super bekvämt va?
Visa undantagets stackspårning
Klassen har förresten Throwable
en annan metod för att arbeta med stackspårningar, en metod som visar all stackspårningsinformation som är lagrad i undantaget. Det kallas printStackTrace()
.
Ganska bekvämt kan du kalla det på vilket undantag som helst.
Exempel:
Koda |
---|
|
Konsolutgång |
|
GO TO FULL VERSION