java不抛错的情况,如何定位到函数所在源代码行数?

先来 2015-04-22 11:47:22
类名和函数名都可以用反射获取,行数要怎样获取?
例如报错的效果,
...全文
341 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
youzi05 2015-04-24
  • 打赏
  • 举报
回复
额, 上面那段代码有点乱.. 我整理了一下, 写了个博客, lz可以去看看: http://blog.csdn.net/u011004037/article/details/45224155
youzi05 2015-04-22
  • 打赏
  • 举报
回复
引用 3 楼 t_jl1979 的回复:
log4j库,打印一条日志,里面包含类名,方法名,行号。
呵呵....

public class Test{
	public static void main(String[] args) {
		test();
	}

	public static void printLine(String mess){
		StackTraceElement[] stes = new Throwable().getStackTrace();
		StackTraceElement tmp = stes[stes.length-2];
		System.out.print( mess + ":" );
		System.out.println( tmp );
		System.out.println( tmp.getFileName() + tmp.getMethodName() 
			+ "(" + tmp.getFileName() + tmp.getLineNumber() + "): " 
			+ mess );
	}

	private static void test(){
		printLine( "this is message" );
	}
}
冥王之锤 2015-04-22
  • 打赏
  • 举报
回复
log4j库,打印一条日志,里面包含类名,方法名,行号。
youzi05 2015-04-22
  • 打赏
  • 举报
回复
额, 我想到的就是看源码, lz所示的格式其实是Throwable.printStackTrace()打印出来的格式, 所以查看这个方法的源码发现有如下一段代码:

StackTraceElement[] trace = getOurStackTrace();
for (StackTraceElement traceElement : trace)
    s.println("\tat " + traceElement);
可以发现这段代码就是下面显示 at 包.类.方法(文件:行号) 的代码, 那么我们看看 getOurStackTrace() 方法, 其中又有这么一段代码:

stackTrace = new StackTraceElement[depth];
for (int i=0; i < depth; i++)
	stackTrace[i] = getStackTraceElement(i);
看完全部的代码后就会发现, 这段代码很明显就是获得行号的代码, 那么, 顺藤摸瓜, 看getStackTraceElement() 方法:

native StackTraceElement getStackTraceElement(int index);
再快得到真相的时候, 线索断了, 好吧, 我确实不知道是怎么得到行号的, 下面的是我根据其他东西猜出来的, lz不妨看看 首先, 我确实是第一次见native这个关键字, 所以查了一下, 发现这个关键字的作用是这样的:
引用
一个Native Method就是一个Java调用非Java代码的接口。一个Native Method是这样一个Java的方法:该方法的实现由非Java语言实现,比如C或C++。
更详细的信息lz可以自己查一下. 接下来, 我想到了javap,
引用
javap是jdk自带的一个工具,可以反编译,也可以查看java编译器生成的字节码,是分析代码的一个好工具。
我们可以看到, javap有一个参数,
引用
-l(字母小写l) 输出行号和本地变量表
这意味着什么?这应该就是在说.class文件中有行号信息吧, 不然怎么可能输出行号呢? 所以, 我写了一个及其怪异的java程序, 有时几个语句一行, 有时两个语句隔三四行, 然后使用javap命令反编译, 发现输出的行号完全正确, 那么这个时候可以相信.class文件是有行号信息了吧, ok, 我们再说getStackTraceElement方法, 它既然不是用java写的, 而是用其他语言, 那么我们能不能猜测它其实是调用了java.exe(或者java.exe依赖的某个.dll文件)中的一个隐藏借口呢? 既然java程序是在java.exe上执行的(正常执行时), 那么执行堆栈应该也只有java.exe知道吧, 至于行号,java.exe完全可以从.class文件中读取, 那么, 我们猜测getStackTraceElement方法调用了java.exe中的某个隐藏借口也是可以的吧, 以上就是我的猜测...
东东东雷 2015-04-22
  • 打赏
  • 举报
回复
不抛错 只能自己debug

62,614

社区成员

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

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