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

转自: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有关,期盼高人指点.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你写一个Java程序,从文件中读取春晓这首诗,并通过输出流在控制台上输出,每行输出加入行号。 以下是完整的Java代码实现: ```java import java.io.*; public class Main { public static void main(String[] args) { try { // 创建输入流,读取文件 FileInputStream fis = new FileInputStream("chunxiao.txt"); InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); BufferedReader br = new BufferedReader(isr); // 创建输出流,输出到控制台 OutputStreamWriter osw = new OutputStreamWriter(System.out); BufferedWriter bw = new BufferedWriter(osw); // 定义行号 int lineNum = 1; // 逐行读取文件,并输出到控制台 String line = null; while ((line = br.readLine()) != null) { // 输出行号和内容 bw.write(lineNum + ": " + line); bw.newLine(); lineNum++; } // 关闭流 br.close(); isr.close(); fis.close(); bw.close(); osw.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 在上面的代码中,我们使用了Java的输入流和输出流来读取文件输出到控制台。具体来说,我们使用了以下几个类: - FileInputStream:用于从文件中读取数据。 - InputStreamReader:用于将字节流转换为字符流,可以指定字符集编码。 - BufferedReader:用于逐行读取字符流。 - OutputStreamWriter:用于将字符流转换为字节流,可以指定字符集编码。 - BufferedWriter:用于逐行写入字符流。 我们首先通过创建FileInputStream、InputStreamReader和BufferedReader对象,来读取文件中的数据。在读取文件,我们指定了文件的编码格式为UTF-8,这是为了确保中文字符能够正确地被读取。 接着,我们通过创建OutputStreamWriter和BufferedWriter对象,来输出内容到控制台。在输出内容,我们使用了bw.write()方法和bw.newLine()方法来输出内容和换行符。同,我们还定义了一个变量lineNum来表示行号,每输出一行内容,我们就将行号加1。 最后,我们在程序结尾处关闭了所有的流对象,以确保资源得到正确释放。 你可以将上面的代码保存为一个Java文件,然后将“chunxiao.txt”文件放在与Java文件相同的目录下,然后编译运行该程序,就可以在控制台上看到从文件中读取的春晓诗,并且每行都加上了行号

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值