java.lang.ArithmeticException выдается без трассировки стека и без сообщения

@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);
          }
     }

Приведенный выше код создает исключение java.lang.ArithmeticException без трассировки стека и без сообщения. Я не создаю/выбрасываю пустое исключение ArithmeticException в блоке try. Какой вызов/код метода java может вызывать java.lang.ArithmeticException без трассировки стека и без сообщения об ошибке?

И видел ли кто-нибудь исключение ArithmeticException в java без сообщения раньше? Вывод журнала:

ноль java.lang.ArithmeticException


person suresh    schedule 12.01.2018    source источник
comment
Какую структуру ведения журнала вы используете? Вам необходимо зарегистрировать исключение как исключение, чтобы платформа зарегистрировала трассировку стека. Кроме того, вы пропустили весь код, который может содержать арифметическую проблему. поэтому мы не можем вам помочь. Зарегистрируйте полное исключение, а затем отредактируйте сообщение, включив в него трассировку стека и код, вызвавший исключение.   -  person Jim Garrison    schedule 12.01.2018
comment
трассировка стека не печатается, а e.getMessage имеет значение null. Это структура log4j. Я вижу другое исключение, напечатанное с трассировкой стека. Мой вопрос: кто-нибудь видел ArithmeticException в java без сообщения раньше?   -  person suresh    schedule 12.01.2018
comment
Трассировка стека не печатается, потому что в блоке catch (Exception e) вы ее не печатаете, а регистрируете только ошибку с сообщением об исключении но не трассировку стека. Вот почему я спросил, какую структуру Looger вы используете, чтобы найти API для регистрации исключения, включающего трассировку стека.   -  person Jim Garrison    schedule 12.01.2018
comment
Я ищу java.lang.ArithmeticException: null без трассировки стека @suresh, ты когда-нибудь это понимал?   -  person Rich    schedule 07.06.2019


Ответы (2)


Из Javadoc:

ArithmeticException возникает, когда возникает исключительное арифметическое условие. Например, целое число "делится на ноль" создает экземпляр этого класса. Объекты ArithmeticException могут создаваться виртуальной машиной, как если бы подавление отключено и/или трассировка стека недоступна для записи.

Вы конструируете объекты Throwable в этом блоке уникальным способом?

person Jaco Van Niekerk    schedule 12.01.2018
comment
Я не выбрасываю никаких исключений или выбрасываемых объектов. - person suresh; 12.01.2018

Для некоторых часто возникающих исключений JVM сделает оптимизацию, чтобы скрыть трассировку стека. Когда сервер перезапустится, трассировка стека этого исключения снова отобразится.

Оптимизированная версия

java.lang.ArithmeticException: ноль

После перезагрузки

java.lang.ArithmeticException: / на ноль в java.math.BigDecimal.divideAndRound(BigDecimal.java:4106) в java.math.BigDecimal.divide(BigDecimal.java:5153)

Вы можете добавить параметр виртуальной машины -XX:-OmitStackTraceInFastThrow, чтобы закрыть эту оптимизацию.

person eip777    schedule 04.02.2021