输出调用当前方法的类、方法、行数
在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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .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 接口并集成到在线客服系统