Java 打印堆栈跟踪,标记为;警告";而不是",;“错误”;

Java 打印堆栈跟踪,标记为;警告";而不是",;“错误”;,java,Java,我有这表示警告,而不是异常/错误 new Error("Warning: Callback fired more than once.").printStackTrace(System.err); 看起来是这样的: java.lang.Error: Warning: Callback fired more than once. 我的问题是,怎样才能创建警告而不是错误,比如: new Warning("Warning: Callback fired more than once.").prin

我有这表示警告,而不是异常/错误

new Error("Warning: Callback fired more than once.").printStackTrace(System.err);
看起来是这样的:

java.lang.Error: Warning: Callback fired more than once.
我的问题是,怎样才能创建警告而不是错误,比如:

new Warning("Warning: Callback fired more than once.").printStackTrace(System.err);
以便打印出:

java.lang.Warning: Warning: Callback fired more than once.

您可以创建自己的异常类型

public class Warning extends RuntimeException {
  //override constructors
}
然后你就可以做像这样的事情了


新警告(“警告:多次触发回调”).printStackTrace(System.err)

您不能直接执行此操作,一种可能的方法是使用记录器:

public static void main(String[] args) {
    java.util.logging.Logger logger = java.util.logging.Logger.getLogger("");
    logger.warning("warn message");
}
你不能

以便打印出:

java.lang.Warning: Warning: Callback fired more than once.
lang包是“密封的”,您不能创建自己的类,这些类存在于该包中

从这个角度来看,您所能达到的最佳效果就是创建自己的
RuntimeException
子类,以

your.com.whatever.Warning: Warning

除此之外,其他答案都是正确的:这是一个已解决的问题。您即将重新发明轮子,因此真正的答案是后退一步,研究日志框架,并使用它。首先,还要研究如何使用Java异常,如果代码抛出错误实例,那显然是错误的!对于严重的错误情况,错误是JVM本身抛出的非常可怕的东西。它们不应该用于代码中的bug,或者您在这里考虑的任何类型的断言。

您应该为日志框架提供便利。根据您使用的是哪一个,它看起来像
logger.warn(“多次触发回调”)
。如果还需要堆栈跟踪,可以将其添加到日志消息中。如果没有涉及可能在某个时候变得不方便的日志框架,您可以将警告打印到标准输出:
System.out.println(“警告:多次触发回调”)

更好的解决方案是不调用
printStackTrace
,而是使用日志框架。这些都是非常可定制的。另外,不要创建
Error
实例。坚持
例外
。伟大的头脑会随机应变。。。让我投票支持比我快一点;-)