java 自定义异常作为常量时,打印的异常信息不对

问题描述

当把异常作为常量时,打印的异常调用链不对

相关代码

异常类

public class UserException extends RuntimeException {

    private static final long serialVersionUID = -1932290828991021225L;
    private State state;

    public UserException() {
        this.state = StateCode.SERVER_ERROR;
    }

    public UserException(String tip) {
        this.state = new State(StateCode.SERVER_ERROR.getCode(), tip);
    }

    public UserException(int errCode, String tip) {
        this.state = new State(errCode, tip);
    }

    public UserException(State state) {
        this.state = state;
    }

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }
}

异常常量类

public interface TipExceptionConstants {

    TipException ENTITY_NOT_EXIST = new TipException("对象不存在");

    TipException NEED_LOGIN = new TipException("请用户登录");
}

测试类

@Slf4j
public class TestException {

    public static void main(String[] args){
        log.error("error : 10", TipExceptionConstants.ENTITY_NOT_EXIST);
        log.info("------------------------");
        log.info("------------------------");
        log.error("error : 13", TipExceptionConstants.NEED_LOGIN);
        log.info("------------------------");
    }
}

打印出来的log

cn.test.exception.TipException: null
    at cn.test.exception.TipExceptionConstants.<clinit>(TipExceptionConstants.java:11)
    at test.TestException.main(TestException.java:10)
17:02:45.249 [main] INFO test.TestException - ------------------------
17:02:45.249 [main] INFO test.TestException - ------------------------
17:02:45.249 [main] ERROR test.TestException - error : 13
cn.test.exception.TipException: null
    at cn.test.exception.TipExceptionConstants.<clinit>(TipExceptionConstants.java:12)
    at test.TestException.main(TestException.java:10)
17:02:45.249 [main] INFO test.TestException - ------------------------

你期待的结果是什么?实际看到的错误信息又是什么?

打印出来的堆栈调用链不对,两次调用链都是
at test.TestException.main(TestException.java:10)
第二个打印的异常log的调用链应该是第13行的代码,但是却显示了第一次打印的异常调用链。

阅读 3.4k
2 个回答

一般提醒内容作为字符串常量

public final static String ENTITY_NOT_EXIST = "对象不存在"; 

打印的时候,作为参数传进去

log.error("error : 10", new UserException(TipExceptionConstants.ENTITY_NOT_EXIST));

已经做成常量了,stack trace初始化的时候是什么以后就是什么了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题