使用 J2SE 1.4 以前版本的開發人員往往需要檢測程序運行到了什么位置,也就是當前運行的方法。例如,在記錄程序運行過程的時候就有這樣的需求。直到現在,開發人員們仍然問著同樣的問題。不過,在 J2SE 1.4 中,這個問題的答案簡單了許多。
找到當前運行位置的較原始的方法是產生一個異常,將追蹤堆棧輸出到內存中的一個緩沖區,然后從這些追蹤信息中找出你需要的信息。刪除無用的信息之后,剩下的就是你要尋找的方法名。如下例代碼:
import java.io.*;
public class ManualDump {
public static void main(String args[])
throws IOException {
Throwable t = new Throwable();
StringWriter sw = new StringWriter();
PRintWriter pw = new PrintWriter(sw);
t.printStackTrace(pw);
String input = sw.getBuffer().toString();
StringReader sr = new StringReader(input);
BufferedReader br = new BufferedReader(sr);
br.readLine(); // Exception name
String line = br.readLine();
int paren = line.indexOf('(');
line = line.substring(0, paren);
int period = line.lastIndexOf('.');
line = line.substring(period+1);
System.out.println("Method: " + line);
}
}
運行 ManualDump 將顯示:Method: main
這個原始的方法在 J2SE 1.4 中仍然可用,但有一個更簡潔的方法為分析堆棧中的信息。J2SE 1.4 中有一個新的特征,就是連鎖異常功能 (Chained Exception Facility)。這個功能答應你說明異常 X 是導致異常 Y 的原因,也可以使你有能力超躍打印追蹤棧這一作法——你可以獲得追蹤棧并自己“打印”它。你只需要簡單的調用 Throwable 類的一個新方法 etStackTrace 即可獲得一個 StackTraceElement 對象數組。這個類中定義了一個名為 getMethodName 的方法。位于數組索引號為 0 位置的 StackTraceElemnt 對象就是當前的方法:
public class AutoDump {
public static void main(String args[]) {
Throwable t = new Throwable();
StackTraceElement elements[] = t.getStackTrace();
String method = elements[0].getMethodName();
System.out.println("Method: " + method);
}
}
運行 AutoDump 將顯示:Method: main
通過 getStackTrace 方法,你完全可以改變 printStackTrace 的結果,或者創建你自己的輸出格式。因為你可以很輕易地獲得方法名了。
也許你認為有了 StackTraceElement 你就可以根據需要做任何事情了,從技術上來說,的確如此。然而,我必須提及另一件事。假如你是為了記錄運行過程而獲取方法名,不要忘了還有 Java Logging API。你可以在 java.util.logging 包里找到相關的類。它們答應你一直記錄,包括記錄當前的方法。更重要的是,Java Logging API 答應你做這些記錄而不需要手工去找出方法名。這些 API 已經在其它技巧類文章中提及,這里不不多說了。
新聞熱點
疑難解答