java.lang.ArithmeticException 在没有堆栈跟踪和消息的情况下抛出

sur*_*esh 3 java exception grpc-java

@Override
public StreamObserver<MdtDialoutArgs> mdtDialout(StreamObserver<MdtDialoutArgs> responseObserver) {

    return new StreamObserver<MdtDialoutArgs>() {

        @Override
        public void onError(Throwable t) {
            logger.warn( "Encountered error in mdtDialout");
        }

        @Override
        public void onCompleted() {
            responseObserver.onCompleted();
        }

        @Override
        public void onNext(MdtDialoutArgs arg0) {
           try {
                ....
                ....
                ...
          } catch (Exception e) {
               logger.error(e.getMessage(), e);
          }
     }
Run Code Online (Sandbox Code Playgroud)

上面的代码抛出一个 java.lang.ArithmeticException ,没有堆栈跟踪,也没有消息。我没有在 try 块中创建/抛出空的 ArithmeticException 。什么java方法调用/代码可以抛出java.lang.ArithmeticException,没有堆栈跟踪,也没有错误消息?

有没有人见过java中没有消息的ArithmeticException?日志输出:

null java.lang.ArithmeticException

小智 5

对于一些频繁抛出的异常,JVM会进行优化以隐藏堆栈跟踪。当服务器重新启动时,该异常的堆栈跟踪将再次显示。

优化版本

java.lang.ArithmeticException: null

重启后

java.lang.ArithmeticException:/在java.math.BigDecimal.divideAndRound(BigDecimal.java:4106)处按零在java.math.BigDecimal.divide(BigDecimal.java:5153)处

您可以添加 VM 选项-XX:-OmitStackTraceInFastThrow来关闭此优化。