在程序中的任意点生成Java堆栈跟踪

在程序中的任意点生成Java堆栈跟踪,java,exception,stack-trace,Java,Exception,Stack Trace,可能重复: 我有一个方法可以将消息保存到文件中。这个方法是从我的主程序的许多不同部分调用的。是否有任何方法可以根据需要生成堆栈跟踪,即使未触发异常 例如,我希望有这样的事情 void saveMsg(String Msg) { if (a==b) Print Out Where This Method Was Called From [ like stackTrace in exception ] else saveMsgToFile(filePath,Msg); } 我知道Java

可能重复:

我有一个方法可以将消息保存到文件中。这个方法是从我的主程序的许多不同部分调用的。是否有任何方法可以根据需要生成堆栈跟踪,即使未触发
异常

例如,我希望有这样的事情

void saveMsg(String Msg)
{
  if (a==b) Print Out Where This Method Was Called From [ like stackTrace in exception ]
  else saveMsgToFile(filePath,Msg);
}

我知道Java可以在
异常中堆叠跟踪
,但是当没有发生
异常
时,如何生成堆栈跟踪?

您可以生成自己的
异常
并捕获结果

try {
    throw new Exception("Tracing only");
}
catch (Exception e){
    e.printStackTrace();
}
将此代码放在要输出堆栈跟踪的任何位置

这样做的好处是
e.printStackTrace()异常
,您还可以为原因指定文本字符串(在本例中为
“仅跟踪”
),因此您可以轻松地使用有意义的标题自定义跟踪输出,例如
“跟踪saveMsg方法”

或者,您可以通过调用此

Thread.currentThread().getStackTrace();
但是,这会给您留下一个
stackTraceeElement
s数组,您必须循环到输出。在我看来,与第一个选项一样,只生成和捕获自己的
异常更容易、更干净。

只需执行,这将把堆栈跟踪打印到控制台。没有必要在创建异常和捕获异常时出错。

不幸的是,只有

    Thread.currentThread().getStackTrace();

对你的任务有用。问题是,前面提到的所有方法都会在堆栈顶部打印您的方法(saveMsg),但这通常是不可取的。相反,您必须跳过从getStackTrace()方法返回的第一个元素。

打印stacktrace时不需要抛出异常。只需
newexception().printStackTrace()
就可以了。