java怎样得到运行时程序的行号

     注意到log4j可以输出代码的行号,我就感到很奇怪,log4j是怎样输出代码的行号的?带着这个疑问,到网上找了一些列子,才发现原来是这个样子,具体是怎么一回事,就听我下面细细道来,不要怪我文笔太差,希望大家多多的指教。

    先来看下下面的代码:

  StackTraceElement[] elements = Thread.currentThread().getStackTrace();
		for(StackTraceElement element : elements){
			System.out.println("className : " + element.getClassName());
			System.out.println("fileName : " + element.getFileName());
			System.out.println("lineNumber : " + element.getLineNumber());
			System.out.println("methodName : " + element.getMethodName());
			System.out.println("*************************************");
		}

  运行可以得到如下的输出:

className : java.lang.Thread
fileName : Thread.java
lineNumber : 1479
methodName : getStackTrace
*************************************
className : com.warnow.test.StackTraceElementTest
fileName : StackTraceElementTest.java
lineNumber : 9
methodName : main
*************************************

  StackTraceElement到底是个什么样的对象,参看java api,可以看到这个类有这样的构造器StackTraceElement(String declaringClass, String methodName, String fileName, int lineNumber)在构造这个类的时候已经把相关的信息存进来了, StackTraceElement代表堆栈中的每个Element,用来存放类名,方法名,文件名,行号等信息。也可以通过 Throwable.getStackTrace()来获取StackTraceElement数组(存放的是所有的),通过StackTraceElement对象就可以获取到类名,文件名,运行的代码的行号,方法名。从上面的输出可以看出最后的那个StackTraceElement就是我们当前运行主函数。加入有类似如下的代码运行的结果会是怎样呢?

       //get all StackTraceElement instance.
		//StackTraceElement[] elements = Thread.currentThread().getStackTrace();
		StackTraceElement[] elements = new Throwable().getStackTrace();
		for(StackTraceElement element : elements){
			System.out.println("className : " + element.getClassName());
			System.out.println("fileName : " + element.getFileName());
			System.out.println("lineNumber : " + element.getLineNumber());
			System.out.println("methodName : " + element.getMethodName());
			System.out.println("*************************************");
			//System.out.println("class : " + element.getClass());
			//System.out.println("*****************************************************");
			//throw new RuntimeException("xxxx");
		}

    与上面不同这次同过 Throwable.getStackTrace()来获取的输出结果如下:

                   className : com.warnow.test.StackTraceElementTest
                  fileName : StackTraceElementTest.java
                  lineNumber : 10
                 methodName : main
                *************************************

这次的输出就只有主函数信息,先就写到这里了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值