有无办法在Java程序出现异常时输出其文件和行号?

HeavyArmorTroops 2005-10-25 04:12:54
不知java程序或Eclipse能否办到?
...全文
733 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
HeavyArmorTroops 2005-10-26
  • 打赏
  • 举报
回复
经跟踪发现,现在用这个办法可以完全搞定:
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有关,期盼高人指点.
HeavyArmorTroops 2005-10-26
  • 打赏
  • 举报
回复
我使用了如下方法获得异常所在的文件,行号和方法:
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$1.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];还要继续挖掘.
wst302 2005-10-26
  • 打赏
  • 举报
回复
log4j可以打出在哪一行被调用的,你把它放在catch里面就好了
lzmailcn 2005-10-26
  • 打赏
  • 举报
回复
这样也很有效:

public class myClass(){
public myClass(){}

public void myFonction(){
try{
//do things you want!
}catch(Exception e){
System.out.println("程序异常!\t代码:myClass.myFonction()");
}
}
}
huangdeji 2005-10-26
  • 打赏
  • 举报
回复
HeavyArmorTroops 2005-10-26
  • 打赏
  • 举报
回复
取异常的棧信息是解决之道,我先去看看.
cjhyahoo 2005-10-25
  • 打赏
  • 举报
回复
e.getStackTrace()

用jbuilder 或 eclipse 开发,
可以点一下就跳到那里去
xlyyc 2005-10-25
  • 打赏
  • 举报
回复
楼上的,log4j可以实现的吗?汗,用到现在的LOG4J还不知道呢
奇伢 2005-10-25
  • 打赏
  • 举报
回复
log4j
HeavyArmorTroops 2005-10-25
  • 打赏
  • 举报
回复
e.getStackTrace()[0].getLineNumber()/getFileName()
无法处理类反射出现的异常.
ChDw 2005-10-25
  • 打赏
  • 举报
回复
e.getStackTrace()[0].getLineNumber()/getFileName()
HeavyArmorTroops 2005-10-25
  • 打赏
  • 举报
回复
printStackTrace()信息太多,如何只输出
其文件名和行号.
ngqzmjmj 2005-10-25
  • 打赏
  • 举报
回复
打印printStackTrace()
majy 2005-10-25
  • 打赏
  • 举报
回复
exception的内容中已经有了

62,624

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧