Java >> Java tutorial >  >> Tag >> Stack

Få den aktuelle staksporing i Java

1. Oversigt

Som Java-udvikler er det meget almindeligt at støde på begrebet staksporing, når man har med undtagelser at gøre.

I dette selvstudie forstår vi, hvad en staksporing er, og hvordan man bruger den under programmering/fejlretning. Desuden vil vi også gennemgå StackTraceElement klasse. Til sidst lærer vi, hvordan du får det ved hjælp af tråden og kan kastes klasser.

2. Hvad er et stakspor?

En stak-sporing, også kaldet en back-trace, er en liste over stak-rammer. Med enkle ord repræsenterer disse frames et øjeblik under programafvikling.

En stakramme indeholder information om en metode, som koden har kaldt . Det er en liste over rammer, der starter ved den aktuelle metode og strækker sig til programmet startede.

For at forstå dette bedre, lad os se på et hurtigt eksempel, hvor vi har dumpet den aktuelle stak-sporing efter en undtagelse:

public class DumpStackTraceDemo 
{ 
    public static void main(String[] args) {
        methodA(); 
    } 

    public static void methodA() {
        try {
            int num1 = 5/0; // java.lang.ArithmeticException: divide by zero
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}

I ovenstående eksempel, methodA() kaster ArithmeticException, som igen dumper den aktuelle stak-sporing i fangsten blokere:

java.lang.ArithmeticException: / by zero
at main.java.com.baeldung.tutorials.DumpStackTraceDemo.methodA(DumpStackTraceDemo.java:11)
at main.java.com.baeldung.tutorials.DumpStackTraceDemo.main(DumpStackTraceDemo.java:6)

3. StackTraceElement Klasse

En staksporing består af elementer i StackTraceElement klasse. Vi kan bruge følgende metoder til at få henholdsvis klasse- og metodenavne:

  • getClassName – returnerer det fuldt kvalificerede navn på klassen, der indeholder det aktuelle udførelsespunkt.
  • getMethodName – returnerer navnet på metoden, der indeholder udførelsespunktet repræsenteret af dette staksporingselement.

Vi kan se en komplet liste over metoder og deres detaljer i StackTraceElement klasse i Java API-dokumentationen.

4. Få et stakspor ved hjælp af tråden Klasse

Vi kan få et stakspor fra en tråd ved at kalde getStackTrace() metode på Tråden eksempel. Det returnerer en matrix af StackTraceElement , hvorfra detaljer om stabelrammer af tråden kan findes.

Lad os se et eksempel:

public class StackTraceUsingThreadDemo {

    public static void main(String[] args) {
        methodA();
    }
    
    public static StackTraceElement[] methodA() {
        return methodB();
    }

    public static StackTraceElement[] methodB() {
        Thread thread = Thread.currentThread();
        return thread.getStackTrace();
    }
}

I ovenstående klasse sker metodekaldene på følgende måde – main() -> methodA() -> methodB() -> getStackTrace().

Lad os verificere det med følgende testcase, hvor testcasemetoden kalder methodA() :

@Test
public void whenElementIsFetchedUsingThread_thenCorrectMethodAndClassIsReturned() {
    StackTraceElement[] stackTrace = new StackTraceUsingThreadDemo().methodA();
    
    StackTraceElement elementZero = stackTrace[0];
    assertEquals("java.lang.Thread", elementZero.getClassName());
    assertEquals("getStackTrace", elementZero.getMethodName());
    
    StackTraceElement elementOne = stackTrace[1];
    assertEquals("com.baeldung.tutorials.StackTraceUsingThreadDemo", elementOne.getClassName());
    assertEquals("methodB", elementOne.getMethodName());
    
    StackTraceElement elementTwo = stackTrace[2];
    assertEquals("com.baeldung.tutorials.StackTraceUsingThreadDemo", elementTwo.getClassName());
    assertEquals("methodA", elementTwo.getMethodName());
    
    StackTraceElement elementThree = stackTrace[3];
    assertEquals("test.java.com.baeldung.tutorials.CurrentStacktraceDemoUnitTest", elementThree.getClassName());
    assertEquals("whenElementIsFetchedUsingThread_thenCorrectMethodAndClassIsReturned", elementThree.getMethodName());
}

I ovenstående testcase hentede vi et array af StackTraceElement ved hjælp af methodB() af StackTraceUsingThreadDemo klasse. Bekræft derefter metode- og klassenavne i stak-sporingen ved hjælp af getClassName() og getMethodName()  metoder til StackTraceElement klasse.

5. Få et stakspor ved hjælp af Skastbare Klasse

Når et Java-program kaster en Throwable objekt, i stedet for blot at udskrive det på konsollen eller logge det, kan vi få en række StackTraceElement objekter ved at kalde getStackTrace() metode.

Lad os se på et eksempel:

public class StackTraceUsingThrowableDemo {
    
    public static void main(String[] args) {
        methodA(); 
    } 

    public static StackTraceElement[] methodA() {
        try {
            methodB();
        } catch (Throwable t) {
            return t.getStackTrace();
        }
        return null;
    }

    public static void methodB() throws Throwable {
        throw new Throwable("A test exception");
    }
}

Her sker metodekaldene på følgende måde – main() -> methodA() -> methodB() -> getStackTrace().

Lad os bekræfte det ved hjælp af en test:

@Test
public void whenElementIsFecthedUsingThrowable_thenCorrectMethodAndClassIsReturned() {
    StackTraceElement[] stackTrace = new StackTraceUsingThrowableDemo().methodA();

    StackTraceElement elementZero = stackTrace[0];
    assertEquals("com.baeldung.tutorials.StackTraceUsingThrowableDemo", elementZero.getClassName());
    assertEquals("methodB", elementZero.getMethodName());

    StackTraceElement elementOne = stackTrace[1];
    assertEquals("com.baeldung.tutorials.StackTraceUsingThrowableDemo", elementOne.getClassName());
    assertEquals("methodA", elementOne.getMethodName());

    StackTraceElement elementThree = stackTrace[2];
    assertEquals("test.java.com.baeldung.tutorials.CurrentStacktraceDemoUnitTest", elementThree.getClassName());
    assertEquals("whenElementIsFecthedUsingThrowable_thenCorrectMethodAndClassIsReturned", elementThree.getMethodName());
}

I ovenstående testcase hentede vi et array af StackTraceElement ved hjælp af methodB() af StackTraceUsingThrowableDemo klasse. Derefter verificerede metode- og klassenavne for at forstå rækkefølgen af ​​elementer i array af StackTraceElement klasse.

6. Konklusion

I denne artikel lærte vi om Java-staksporingen, og hvordan vi kan udskrive den ved hjælp af printStackTrace() metode, i tilfælde af en undtagelse. Vi har også set på, hvordan man får aktuel staksporing ved hjælp af tråden og kastbar klasser.

Som altid kan de komplette kodeeksempler til denne artikel findes på GitHub.


Java tag