`
Eastsun
  • 浏览: 304573 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

一种得到代码所在行号的方法

阅读更多

       RT,今天在论坛上看到有人提出这个问题,马上联想到当程序发生异常时,异常信息里面就包含了异常所在行的信息.既然这样,那我为何不再需要得到行号的地方new 一个Exception,然后分析其包含的行号信息呢?

      想法有了,剩下的就简单了,查了下Exception的相关文档,发现Throwable有个getStackTrace()的方法:

getStackTrace

public StackTraceElement
[] getStackTrace
()
Provides programmatic access to the stack trace information printed by printStackTrace() . Returns an array of stack trace elements, each representing one stack frame. The zeroth element of the array (assuming the array's length is non-zero) represents the top of the stack, which is the last method invocation in the sequence. Typically, this is the point at which this throwable was created and thrown. The last element of the array (assuming the array's length is non-zero) represents the bottom of the stack, which is the first method invocation in the sequence.

Some virtual machines may, under some circumstances, omit one or more stack frames from the stack trace. In the extreme case, a virtual machine that has no stack trace information concerning this throwable is permitted to return a zero-length array from this method . Generally speaking, the array returned by this method will contain one element for every frame that would be printed by printStackTrace .

 

Returns:
an array of stack trace elements representing the stack trace pertaining to this throwable.

 

getLineNumber

public int getLineNumber
()
Returns the line number of the source line containing the execution point represented by this stack trace element. Generally, this is derived from the LineNumberTable attribute of the relevant class file (as per The Java Virtual Machine Specification , Section 4.7.8).

 

Returns:
the line number of the source line containing the execution point represented by this stack trace element, or a negative number if this information is unavailable.


最终的代码如下:

java 代码
  1. /**    
  2.  *得到Exception所在代码的行数    
  3.  *如果没有行信息,返回-1    
  4.  */      
  5.   public   static   int  getLineNumber(Exception e){      
  6.      StackTraceElement[] trace =e.getStackTrace();      
  7.       if (trace== null ||trace.length== 0 return  - 1 ;    //      
  8.       return  trace[ 0 ].getLineNumber();      
  9.  }     


使用方法如下:

java 代码
  1. System.out.println( "Current line number :" +getLineNumber( new  Exception()));     

就可以将System.out.println所在行的行号输入.

ps:根据getStackTrace说明文档的红色部分,说明getStackTrace返回内容并没有被硬性规定,因此我这种方法并不能保证在每一个JVM上都有效.但我暂时还不知道有没有其它更好的方法可以实现同样的功能.

而StackTraceElement有个getLineNumber的方法:

分享到:
评论
5 楼 LucasLee 2007-04-03  
直接打出Exception stack就可以了,你单独获得这个行号有什么意义么?
在Eclipse等IDE里,可以直接在控制台中点击抛出异常的某行而直接跳到对应的源码行。

4 楼 xiaoyu 2007-04-03  
不一定准确. 因为trace[0]不一定是你代码抛出来的. 所以你还要检查一下抛异常的源是谁.
3 楼 Eastsun 2007-04-02  
如果我想在程序中使用这个信息呢?
2 楼 dada 2007-04-02  
stackTrace的toString不是有了这个信息了吗?
为啥要自己获取?
1 楼 Eastsun 2007-04-02  
<br/>
<strong>奇怪,为什么直接从剪切板中贴上来的东西会不见呢...</strong>

相关推荐

    自己动手写操作系统(含源代码).part2

    正如于渊在本书结尾中所说“我们写自己的操作系统是出于一种好奇,或者说一种求知欲。我希望这样不停地‘过把瘾’能让这种好奇不停地延续”。 好奇心是动力的源泉,追究问题的本质是优秀黑客的必备素质,只有充分...

    自己动手写操作系统(含源代码).part1

    正如于渊在本书结尾中所说“我们写自己的操作系统是出于一种好奇,或者说一种求知欲。我希望这样不停地‘过把瘾’能让这种好奇不停地延续”。 好奇心是动力的源泉,追究问题的本质是优秀黑客的必备素质,只有充分...

    Wim编辑器精通之路

     它作为标准的Vi编辑器存在于Linux的几乎每一种发行版里. 在很多系统里如FreeBSD和Sun Solaris 8它作为一个便于安装的独立软件包, 在其它系统(MS-Windows, Macintosh, OS/2等等)上的源代码和已编译好的可执行程序在...

    编译原理课程设计:词法分析器

    输出token列表(三元组:所在行号,类别,token 内容)如果出错会输出另一种三元组(行号, 对错判定, token内容),并将token列表写入txt文件供任务二LR(1)语法分析器来使用,同时也会将结果输出到result.txt文件...

    vld(Visual Leak Detector 内存泄露检测工具 源码)

    Visual Leak Detector使用了一种方法来获得当前的程序计数器。首先,它调用一个函数,则这个函数的返回地址就是当前的程序计数器,而函数的返回地址可以很容易的从堆栈中拿到。下面是Visual Leak Detector获得当前...

    一个VC 随机数组生成类.rar

    VC 随机数组生成类的源代码,代码由重庆大学光电学院311实验室 袁刚编写,将随机生成的数组序列保存在TXT中,srand((unsigned)time(NULL));// 生成时间种子  m=rand()%m_Txt_Line;// 返回一个0-m_Txt_Line-1的...

    C 语言编程常见问题解答.chm

    13.4 存储日期的最好方法是哪一种? 13.5 存储时间的最好方法是哪一种? 第14章 系统调用 14.1 怎样检查环境变量(environment variables)的值? 14.2 怎样在程序中调用DOS函数? 14.3 怎样在程序中调用BIOS...

    editplus 代码编辑器html c++ jsp css

    几百个网页中都有下面一段代码: 我想把它们都去掉,可是找了很多search & replace的软件,都是只能对“一行”进行操作。 EditPlus 打开几百个网页文件还是比较顺畅的,所以完全可以胜任这个工作。 具体解决方法,在...

    C语言编程要点

    17.6. 怎样才能只得到一种特定类型的数据,例如字符型数据? 226 17.7. 为什么有时不应该用scanf()来接收数据? 226 17.8. 怎样在程序中使用功能键和箭头键? 227 17.9. 怎样防止用户向一个内存区域中输人过多的字符? ...

    入门学习Linux常用必会60个命令实例详解doc/txt

    在第一种使用格式中有用。 -g,--group=组:自行设定所属组,而不是进程目前的所属组。 -m,--mode=模式:自行设定权限模式 (像chmod),而不是rwxr-xr-x。 -o,--owner=所有者:自行设定所有者 (只...

    西南交大高级语言程序设计第3次实验报告.zip

    若n=5,则b.txt的一种正确格式为 5 9 12 -15 30 -7 即b.txt的第一个数为n,后面是n个整数。 编写程序,从文件b.txt读出n值,建立长度为n的动态1维整型数组,然后继续从文件b.txt读入n个整数存于该数组,进行由小到大...

    c语言数据结构算法演示(Windows版)

    此算法演示可求得所有可行结果,在求得每一种排布的结果之后,均会弹出一个窗口显示“找到第 j (j=1,2,…) 种排布”,单击“确定”按钮将继续进行,直至找到所有可能构成的排布。 6. 背包问题 右侧图示窗口的上方...

    belt:PHP开发人员工具带充满了彩虹和令人赞叹的输出!

    着色选项在控制台调试会话期间有所帮助,该会话升级到您正在转储大量数据并需要一种可视化方式扫描特定消息的阶段。 例子: Belt \ Trace :: debug ( $ your_result );// with Stack TraceBelt \ Trace :: ...

    vim安装包,用于linux十分便捷

    选中代码块 按= 自动对齐 ctags -Rn . ctrl + ] ctrl + t 二、VIM编辑器的使用 vi vim (增强版vi,现在各版本的linux都带有vim) 三种模式: 普通模式:控制光标移动,删除字符,段落复制(按ESC) 编辑...

    Hacking Vim

    不知道是谁 说过一句话:说世界上的程序员分为三种,一种是使用VIM的,还有一种使用Emacs的,剩下的都是第三种。由此可见VIM的强大程度,可以说,这是一款非常适合程序员使用的编辑器。VIM的设计哲学是如果你的工作...

    Linux操作系统基础教程

    GPL 是一种可以使你免费获得自由软件的许可证,因此 Linux 使用 者的使用活动基本不受限制(只要你不将它用于商业目的),而不必像使用微软产品是那样, 2需要为购满许可证付出高价还要受到系统安装数量的限制。我...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    所以只有用第一种方法,将该语句也放到if 语句中,而在else 语句中用else return 0; ,这样如果enterBtn 没有被按下,那么程序就会结 束执行了。 到这里,我们就实现了一个界面结束执行,然后弹出另一个 界面的程序...

Global site tag (gtag.js) - Google Analytics