Exception.getMessage () является нулем - PullRequest
51 голосов
/ 23 ноября 2011

Внутри моего Java-кода он проверяет состояние !null и выдает Exception.

Например

try
{
    if (stud.getCall() != null)
        acc.Call = stud.getCall().toString();
    else
        throw new Exception("Data is null");
}
catch (Exception e)
{
    logger.error("Some Error" + e.getMessage());
    throw new Exception("Please check the Manatadatory Field is Missing" + e.getMessage());
}

Но в логах я получаю:

Some Error null

Почему e.getMessage null?

Ответы [ 8 ]

43 голосов
/ 23 ноября 2011

Вы обнаруживаете исключение, отличное от того, которое явно создается вашим кодом и выдает 1 . Исключение, которое вы ловите, не имеет сообщения. Вам нужно регистрировать все исключение, а не только сообщение об исключении. (Среди прочего, это скажет вам, что представляет собой фактический класс пойманного исключения и где было создано / выброшено исключение.)

Основываясь на том факте, что исключение не имеет сообщения, я бы предположил, что это NPE, вызванное тем, что stud или acc равен нулю, или stud.getCall() возвращает null ... или что-то типа того. NullPointerException, сгенерированный изначально (т.е. JVM), имеет null сообщение 2 .


Бросок java.lang.Exception - это плохая практика

Ваша проблема иллюстрирует, почему вообще плохая идея создать / бросить Exception

Когда вы бросаете Exception, становится почти невозможно провести различие между ним и другими (неожиданными) исключениями в предложении catch. И вот что здесь произошло: вы поймали неправильное исключение.

Вам следует выбрать более конкретное исключение, и, если подходящего не существует, реализовать одно собственное.


1 - Вы также можете использовать e.printStackTrace(), вызов логгера или отладчик, чтобы узнать, какое исключение вы действительно перехватили.

2 - Это не так на Android. Там у NPE есть полезное сообщение, которое дает контекстную информацию.

16 голосов
/ 23 ноября 2011

Попробуйте напечатать исключение, а не просто сообщение, например

logger.error("caught exception while doing whatever", e);

, и посмотрите, что оно делает.Печать только сообщения - рецепт замешательства.Записывая только сообщение, вы отбрасываете трассировку стека с номером строки, указывающим на место, вызвавшее исключение.И теперь вы обнаружили, что не все исключения включают в себя сообщение.

Бросать новое исключение очень плохо, потому что вы отбрасываете исходный тип исключения, а также трассировку стека исходного исключения.Как вы ожидаете выяснить, что пошло не так, когда вы выбросили всю полезную информацию?Если вам нужно перехватить исключение, чтобы зарегистрировать его здесь, то отбросьте то же исключение, которое вы перехватили, по крайней мере, чтобы вы не потеряли трассировку стека.(В качестве альтернативы вы можете сгенерировать новое исключение, когда передаете ссылку на исходное исключение в вызове конструктора.)

Было бы лучше использовать централизованный обработчик исключений, позволяющий выполнять ведение журнала и иметь неожиданныеисключения остаются необработанными, пока они не попадут в обработчик.Поскольку, как только что-то выдает неожиданное исключение, ваше приложение находится в плохом состоянии, все последующие шаги, которые зависят от того, что эта часть должна была выполнить, завершатся неудачно, и вы получите каскад ошибок.

11 голосов
/ 25 февраля 2013

Вот как я исправил ту же проблему, используйте это, чтобы увидеть исключение:

"" + e);

это поможет вам, когда оригинальный программист бросил объект Exception без реализации .getMessage();

Я обвиняю Google в том, что он разрешил объектам Exception значение null getMessage();

когда мой код получал java.lang.NullPointerException впоследствии это приводило к сбою регистрации моего исключения на e.getMessage();

null из .getMessage(); вызвал у меня еще одно необработанное исключение и вывел приложение с сообщением принудительного закрытия. так было и так:

Log.e("MainLogger.Run.Exception", e.getMessage());

и я изменил его на исправленную версию:

Log.e("MainLogger.Run.Exception", "" + e);

теперь возвращается верная строка java.lang.NullPointerException

1 голос
/ 17 июня 2012

Это поздно для партии, но я бы поспорил, что stud - ноль, и вы получите исключение NullPointerException при if (stud.getCall()..... Это одно из исключений, которое, как правило, не имеет сообщения, т. Е. Null.

0 голосов
/ 28 марта 2019

Хотел прокомментировать "" + e ответ Хэмиша, но у меня недостаточно очков репутации ...

Лучше просто использовать e.toString() вместо "" + e.Результат тот же, но внутренне последний может выполнять больше работы с ненужной конкатенацией, включая создание StringBuilder, добавление пустой строки, добавление результата e.toString () и последующее преобразование обратно в String.См. «3. Оператор сложения» https://www.baeldung.com/java-strings-concatenation для получения подробной информации об использовании StringBuilder под обложками.

Что касается исходной проблемы, я бы предложил использовать e.getString () (или даже лучше,сделать полную трассировку стека) вместо просто e.getMessage ().Для некоторых исключений сообщение не имеет смысла, не зная тип исключения.Пример, с которым я столкнулся, - это когда e.getMessage () возвращает «-1», а e.toString () возвращает «ArrayIndexOutOfBoundsException: -1».Что бы вы предпочли видеть в своих журналах?: -)

0 голосов
/ 08 ноября 2017

Надеюсь, это может вам помочь.

Если вы хотите напечатать сообщение «Данные нулевые», то вместо использования встроенного класса «Исключение» попробуйте использовать имявашего собственного класса, где вы написали этот код.Например: если имя класса «DemoClass» (класс, в котором вы написали этот код), напишите так:

 try{
if (stud.getCall() != null)
    acc.Call = stud.getCall().toString();
else
    throw new DemoClass("Data is null");
}
catch (DemoClass e){
logger.error("Some Error" + e.getMessage());}

и если вы перебрасываете, то нене забудьте упомянуть "throws DemoClass" рядом с вашей функцией (где написан этот код):

 throw new DemoClass("Please check the Mandatory Field is Missing" + e.getMessage());
0 голосов
/ 31 октября 2016

Перед вызовом getMessage () вызовите printStackTrace ().этот метод

записывает печатное представление трассировки стека этого Throwable в поток System.err.

try
{
    if (stud.getCall() != null)
        acc.Call = stud.getCall().toString();
    else
        throw new Exception("Data is null");
}
catch (Exception e)
{
    e.printStackTrace();
    logger.error("Some Error" + e.getMessage());
    throw new Exception("Please check the Manatadatory Field is Missing" + e.getMessage());
}
0 голосов
/ 23 ноября 2011

Код выглядит хорошо с синтаксисом, и e.getMessage () не должен быть нулевым, я скомпилировал тот же код и распечатал вывод на консоли, он напечатан как "Some ErrorData is null", что хорошо. Теперь либо есть проблема с вашим логгером, либо вы видите неправильную строку в файле логгера.

в чем может быть проблема с логгером

Это полностью зависит от того, какой регистратор вы используете? Вы переопределили методы looger.error ()? Однако это точно, что e.getMessage () не является нулем в блоке catch. Вы также можете попробовать это, напечатав e.geMessage () на консоли в блоке catch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...