1. 程式人生 > >Java -- 分析堆疊軌跡元素

Java -- 分析堆疊軌跡元素

        最近學習《Java核心技術》終於進行到了第七章異常機制,這章給我的印象比前面的介面,繼承和類好多了,今天分析一下堆疊軌跡元素。

        堆疊軌跡(stack trace)是一個方法呼叫過程的列表,包含了程式執行過程中方法的呼叫的特定位置,當一個程式正常執行終止時候,這個列表會顯示出來。

        直接使用getStackTrace方法,會得到StackTraceElement物件一個數組,可以進行分析

StackTraceElement[] frames  = t.getStackTrace();
		for (StackTraceElement f : frames) {
			System.out.println(f);
		}

        StackTraceElement類含有能夠獲得檔名和當前執行的程式碼行號的方法,同時,含有能夠獲得類名和方法名的方法。

        下面上程式碼:列印了遞迴階乘的函式的堆疊情況()

package com.exception;

import java.util.Scanner;

/**
 * display a trace feature of a recursive method all
 * 顯示所有遞迴方法的跟蹤特性。
 * @author aaa
 *
 */
public class stackTraceTest {
	//factorial階乘
	public static int  factorial(int n) {
		System.out.println("factorial("+ n +"):");
		Throwable t = new Throwable();
		//使用getStackTrace方法 ,得到StackTraceElement物件一個數組,可以進行分析
		StackTraceElement[] frames  = t.getStackTrace();
		for (StackTraceElement f : frames) {
			System.out.println(f);
		}
		int r;
		if (n <= 1) {
			r = 1;
		}else {
			r=n*factorial(n-1);
		}
		System.out.println("return"+r);
		return r;
	}
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		System.out.println("Enter n :");
		int n = in.nextInt();
		factorial(n);
	}
}

例如,如果計算factorial(5); 將列印下列結果:

Enter n :
5
factorial(5):
com.exception.stackTraceTest.factorial(stackTraceTest.java:15)
com.exception.stackTraceTest.main(stackTraceTest.java:34)
factorial(4):
com.exception.stackTraceTest.factorial(stackTraceTest.java:15)
com.exception.stackTraceTest.factorial(stackTraceTest.java:25)
com.exception.stackTraceTest.main(stackTraceTest.java:34)
factorial(3):
com.exception.stackTraceTest.factorial(stackTraceTest.java:15)
com.exception.stackTraceTest.factorial(stackTraceTest.java:25)
com.exception.stackTraceTest.factorial(stackTraceTest.java:25)
com.exception.stackTraceTest.main(stackTraceTest.java:34)
factorial(2):
com.exception.stackTraceTest.factorial(stackTraceTest.java:15)
com.exception.stackTraceTest.factorial(stackTraceTest.java:25)
com.exception.stackTraceTest.factorial(stackTraceTest.java:25)
com.exception.stackTraceTest.factorial(stackTraceTest.java:25)
com.exception.stackTraceTest.main(stackTraceTest.java:34)
factorial(1):
com.exception.stackTraceTest.factorial(stackTraceTest.java:15)
com.exception.stackTraceTest.factorial(stackTraceTest.java:25)
com.exception.stackTraceTest.factorial(stackTraceTest.java:25)
com.exception.stackTraceTest.factorial(stackTraceTest.java:25)
com.exception.stackTraceTest.factorial(stackTraceTest.java:25)
com.exception.stackTraceTest.main(stackTraceTest.java:34)
return1
return2
return6
return24
return120

大概就是這個樣子了~~~

小夥伴們可以關注我的公眾號,留言必回覆哦

Java核心基礎

----------------------------------

長按關注哦(看那兩撇小鬍子)

基礎 | 心得 | 經歷 | 更重要的是開心嘛!