-
1 # 范甘迪
-
2 # 列克美食
使用瞭如下方法獲得異常所在的檔案,行號和方法:
StackTraceElement stackTraceElement= ex.getStackTrace()[0];// 得到異常棧的首個元素
System.out.println("File="+stackTraceElement.getFileName());// 列印檔名
System.out.println("Line="+stackTraceElement.getLineNumber());// 打印出錯行號
System.out.println("Method="+stackTraceElement.getMethodName());// 打印出錯方法
程式如下:
public class ExceptionTest{
public static void main(String[] arg) {
try{
throw new Exception("Exception Test!");
}
catch(Exception ex){
ex.printStackTrace();
String strTemp=ex.getStackTrace().toString();
StackTraceElement stackTraceElement= ex.getStackTrace()[0];
System.out.println("File="+stackTraceElement.getFileName());
System.out.println("Line="+stackTraceElement.getLineNumber());
System.out.println("Method="+stackTraceElement.getMethodName());
}
}
}
輸出如下(在Eclipse3.1中):
java.lang.Exception: Exception Test!
at ExceptionTest.main(ExceptionTest.java:5)
File=ExceptionTest.java
Line=5
Method=main
然而,上述方法不能應付類反射出現的異常,請大家看如下程式:
public void fetchCommand(String strCmmd){
cmmdArgs=strCmmd.split("/s+");
String className="Command"+cmmdArgs[0];
try{
Class cls=Class.forName(className);
cmmd=(Command)cls.newInstance();
}
catch(Exception ex){
ex.printStackTrace();
//System.out.println(ex.getStackTrace()[0].getLineNumber());///getFileName() ;
StackTraceElement stackTraceElement= ex.getStackTrace()[0];
System.out.println("File="+stackTraceElement.getFileName());
System.out.println("Line="+stackTraceElement.getLineNumber());
System.out.println("Method="+stackTraceElement.getMethodName());
}
}
當className不是可識別的類名時,輸出如下:
commandType01 start!
commandType01 Length=3
commandType01 End!
commandType02 start!
commandType02 is: Type02 1 2 3 4
commandType02 End!
File=null // 這裡找不到檔案
Line=-1 // 行出錯
Method=run // 方法錯
commandType02 start!
commandType02 is: Type04 USA Russia China
commandType02 End!
java.lang.ClassNotFoundException: CommandType04
at java.net.URLClassLoader.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at Mediation.fetchCommand(Mediation.java:16) // 這裡倒是對了
at Inlet.main(Inlet.java:11)// 這裡也對
看來StackTraceElement stackTraceElement= ex.getStackTrace()[0];還要繼續挖掘.
經跟蹤發現,現在用這個辦法可以完全搞定:
StackTraceElement stackTraceElement= ex.getStackTrace()[ex.getStackTrace().length-1];
System.out.println("File="+stackTraceElement.getFileName());
System.out.println("Line="+stackTraceElement.getLineNumber());
System.out.println("Method="+stackTraceElement.getMethodName());
這裡的變化是將ex.getStackTrace()[0]修改成了ex.getStackTrace()[ex.getStackTrace().length-1],因為只有陣列的最後一個元素才有我想要的資訊,原先的ex.getStackTrace()[0]只是恰巧陣列的最後一個元素就是首個元素而已.
回覆列表
翻閱JDK,我們找到StackTraceElement這個類。這個類可以從Throwable取得,另外也可以從Thread類取得,透過這些我寫如下的一個列印行號的測試程式: 檢視原始碼