转自:http://junglesong.yculblog.com
我使用了如下方法获得异常所在的文件,行号和方法: 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 大家可以看到,输出基本可以满足需求,但是没有ex.printStackTrace();产生的链接效果,如点击ExceptionTest.java:5 就可以到达错误处,这里不知道如何处理,那位知道请告知. 然而,上述方法不能应付类反射出现的异常,请大家看如下程序: 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]只是恰巧数组的最后一个元素就是首个元素而已. 现在只剩下链接效果的问题了,应该和Eclipse有关,期盼高人指点.