美文网首页
如何在Java程序出现异常时输出其文件和行号

如何在Java程序出现异常时输出其文件和行号

作者: 柳岸花开 | 来源:发表于2017-04-27 09:33 被阅读85次

我使用了如下方法获得异常所在的文件,行号和方法:
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]只是恰巧数组的最后一个元素就是首个元素而已.

相关文章

网友评论

      本文标题:如何在Java程序出现异常时输出其文件和行号

      本文链接:https://www.haomeiwen.com/subject/zrcwzttx.html