In general, we can get our stack trace by calling a method:
1 2 3 |
Thread.currentThread().getStackTrace(); |
1. What a stack trace is?
The stack trace is a report of methods calls in our application. So in simple words: it can tell us where exactly our program is at the point of doing something. Sometimes it is needed when we need control while debugging our application. We can see where exactly an error occurs, where something when wrong and repair it quickly.
2. How to get a stack trace?
Let’s say our program has got main and three other methods. Each method calls next one in its body:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class CurrentStackTrace { public static void main(String[] args) { System.out.println("Main starts"); method1(); System.out.println("Main ends"); } static void method1(){ method2(); } static void method2(){ method3(); } static void method3(){ } } |
Now we want to see how our program goes through these methods. Using the function Thread.currentThread().getStackTrace()
it’s very simple. We need to create the table of our stack elements to know WhereWeAre then display necessary information in a for loop.
Declaring table
1 2 3 |
StackTraceElement[] WhereWeAre = Thread.currentThread().getStackTrace(); |
1 2 3 4 5 |
for (int i = 1; i < WhereWeAre.length; i++){ StackTraceElement ste = WhereWeAre[i]; } |
getMethodName()
but we can add anything we want at this moment. For example, getFileName()
or getLineNumber()
.
1 2 3 4 5 6 7 8 |
for (int i = 1; i < WhereWeAre.length; i++){ StackTraceElement ste = WhereWeAre[i]; System.out.println("\tI'm here: " + ste.getMethodName() + "(in file: " + ste.getFileName() + ", line: " + ste.getLineNumber() + ")"); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
public class CurrentStackTrace { public static void main(String[] args) { System.out.println("Main starts"); method1(); System.out.println("Main ends"); } static void method1(){ System.out.println("Method 1 - go!"); StackTraceElement[] WhereWeAre = Thread.currentThread().getStackTrace(); for (int i = 1; i < WhereWeAre.length; i++){ StackTraceElement ste = WhereWeAre[i]; System.out.println("\tI'm here: " + ste.getMethodName() + "(in file: " + ste.getFileName() + ", line: " + ste.getLineNumber() + ")"); } method2(); } static void method2(){ System.out.println("Method 2 - go!"); StackTraceElement[] WhereWeAre = Thread.currentThread().getStackTrace(); for (int i = 1; i < WhereWeAre.length; i++){ StackTraceElement ste = WhereWeAre[i]; System.out.println("\tI'm here: " + ste.getMethodName() + "(in file: " + ste.getFileName() + ", line: " + ste.getLineNumber() + ")"); } method3(); } static void method3(){ System.out.println("Method 3 - go!"); StackTraceElement[] WhereWeAre = Thread.currentThread().getStackTrace(); for (int i = 1; i < WhereWeAre.length; i++){ StackTraceElement ste = WhereWeAre[i]; System.out.println("\tI'm here: " + ste.getMethodName() + "(in file: " + ste.getFileName() + ", line: " + ste.getLineNumber() + ")"); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Main starts Method 1 - go! I'm here: method1(in file: CurrentStackTrace.java, line: 15) I'm here: main(in file: CurrentStackTrace.java, line: 8) Method 2 - go! I'm here: method2(in file: CurrentStackTrace.java, line: 25) I'm here: method1(in file: CurrentStackTrace.java, line: 20) I'm here: main(in file: CurrentStackTrace.java, line: 8) Method 3 - go! I'm here: method3(in file: CurrentStackTrace.java, line: 35) I'm here: method2(in file: CurrentStackTrace.java, line: 30) I'm here: method1(in file: CurrentStackTrace.java, line: 20) I'm here: main(in file: CurrentStackTrace.java, line: 8) Main ends |