回覆列表
  • 1 # 范甘迪

    翻閱JDK,我們找到StackTraceElement這個類。這個類可以從Throwable取得,另外也可以從Thread類取得,透過這些我寫如下的一個列印行號的測試程式: 檢視原始碼

  • 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]只是恰巧陣列的最後一個元素就是首個元素而已.

  • 中秋節和大豐收的關聯?
  • 介紹家鄉美食的一段話?