随笔 - 178  文章 - 2  评论 - 0  阅读 - 99381

输出调用当前方法的类、方法、行数

在Java中无法输出异常信息时,可能会需要输出调用当前方法的类、方法、行数等信息,根据这些信息可以方便地定位异常原因。

/**
* Created by asus on 2019/7/15.
*/
public class Test {

public static void main(String[] args) {
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
if (stackTraceElements.length > 1) {
System.out.println("main方法输出0---调用类:" + stackTraceElements[0].getClassName() + ",调用方法:" + stackTraceElements[0].getMethodName() + ",调用行数:" + stackTraceElements[0].getLineNumber());
System.out.println("main方法输出1---调用类:" + stackTraceElements[1].getClassName() + ",调用方法:" + stackTraceElements[1].getMethodName() + ",调用行数:" + stackTraceElements[1].getLineNumber());
}
test1();
}

private static void test1 () {
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
if (stackTraceElements.length > 2) {
System.out.println("test1方法输出0---调用类:" + stackTraceElements[0].getClassName() + ",调用方法:" + stackTraceElements[0].getMethodName() + ",调用行数:" + stackTraceElements[0].getLineNumber());
System.out.println("test1方法输出1---调用类:" + stackTraceElements[1].getClassName() + ",调用方法:" + stackTraceElements[1].getMethodName() + ",调用行数:" + stackTraceElements[1].getLineNumber());
System.out.println("test1方法输出2---调用类:" + stackTraceElements[2].getClassName() + ",调用方法:" + stackTraceElements[2].getMethodName() + ",调用行数:" + stackTraceElements[2].getLineNumber());
}
test2();
}

private static void test2 () {
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
if (stackTraceElements.length > 3) {
System.out.println("test2方法输出0---调用类:" + stackTraceElements[0].getClassName() + ",调用方法:" + stackTraceElements[0].getMethodName() + ",调用行数:" + stackTraceElements[0].getLineNumber());
System.out.println("test2方法输出1---调用类:" + stackTraceElements[1].getClassName() + ",调用方法:" + stackTraceElements[1].getMethodName() + ",调用行数:" + stackTraceElements[1].getLineNumber());
System.out.println("test2方法输出2---调用类:" + stackTraceElements[2].getClassName() + ",调用方法:" + stackTraceElements[2].getMethodName() + ",调用行数:" + stackTraceElements[2].getLineNumber());
System.out.println("test2方法输出3---调用类:" + stackTraceElements[3].getClassName() + ",调用方法:" + stackTraceElements[3].getMethodName() + ",调用行数:" + stackTraceElements[3].getLineNumber());
}
}
}
输出信息:

main方法输出0---调用类:java.lang.Thread,调用方法:getStackTrace,调用行数:1556
main方法输出1---调用类:Test,调用方法:main,调用行数:7
test1方法输出0---调用类:java.lang.Thread,调用方法:getStackTrace,调用行数:1556
test1方法输出1---调用类:Test,调用方法:test1,调用行数:17
test1方法输出2---调用类:Test,调用方法:main,调用行数:12
test2方法输出0---调用类:java.lang.Thread,调用方法:getStackTrace,调用行数:1556
test2方法输出1---调用类:Test,调用方法:test2,调用行数:27
test2方法输出2---调用类:Test,调用方法:test1,调用行数:23
test2方法输出3---调用类:Test,调用方法:main,调用行数:12

根据上面输出的信息可以看出:

堆栈信息中

第零个元素显示的是java的Thead类中getStackTrace()方法的调用处;

第一个元素显示的是当前方法中Thread.currentThread().getStackTrace()处;

第二个元素显示的是当前方法的调用处;

第三个元素显示的是当前方法的调用方法的调用处;

......

通过Thread.currentThread().getStackTrace()方法可以获取当前线程的堆栈信息

通过stackTraceElements[0].getClassName()方法可以获取类名(全限定名,例如java.lang.Thread)

通过stackTraceElements[0].getMethodName()方法可以获取方法名

通过stackTraceElements[0].getLineNumber()方法可以获取行号

通过stackTraceElements[0].getFileName()方法可以获取文件名

通过stackTraceElements[0].getClass()方法可以获取Class

 

 

 

 参考博客:https://blog.csdn.net/xsm666/article/details/80823643



posted on   渐行渐远的那些人  阅读(487)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示