Exception.getMessage()为null

Rev*_*thi 53 java exception

在我的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());
}
Run Code Online (Sandbox Code Playgroud)

但在我得到的日志中:

Some Error null
Run Code Online (Sandbox Code Playgroud)

为什么e.getMessage null

Ste*_*n C 45

您正在捕获除代码明确创建并抛出1之外的异常.您捕获的例外没有消息.您需要记录整个异常,而不仅仅是异常消息.(除此之外,这将告诉您捕获的异常的实际类是什么以及创建/抛出异常的位置.)

基于这样的事实,该异常不会有消息,我猜它是由一个NPE studacc为空,或stud.getCall()返回null...或者类似的东西.甲NullPointerException天然产生(由JVM IE)具有null消息2.


投掷java.lang.Exception是不好的做法

你的问题说明了为什么一般来说创建/抛出一个坏主意 Exception

抛出Exception它时,几乎不可能区分它和catch子句中的其他(意外)异常.这就是这里发生的事情:你遇到了错误的例外.

您应该选择一个更具体的异常,如果不存在合适的异常,请实现您自己的异常.


1 - 您还可以使用e.printStackTrace()记录器调用或调试器来查找实际捕获的异常.

2 - 在Android上不是这样.在那里,NPE有一个有用的信息,提供上下文信息.


Nat*_*hes 16

尝试打印异常,而不仅仅是消息

logger.error("caught exception while doing whatever", e);
Run Code Online (Sandbox Code Playgroud)

看看它做了什么.只打印消息是一个混乱的秘诀.通过仅记录您丢弃堆栈跟踪的消息,其中行号指向导致异常的位置.现在你发现并非所有例外都包含一条消息.

抛出新异常是非常糟糕的,因为您丢弃了异常的原始类型,以及原始异常的堆栈跟踪.当你扔掉所有有用的信息时,你怎么能指出出了什么问题呢?如果你必须捕获异常以在此处记录它,那么重新抛出你捕获的同一异常,至少这样你就不会丢失堆栈跟踪.(或者,您可以在构造函数调用中传入对原始异常的引用时抛出一个新异常.)

您最好使用集中式异常处理程序,让它执行日志记录,并在意外异常处理之前不会被捕获.因为一旦某些东西抛出了意外的异常,你的应用程序处于错误状态,任何依赖于这部分本应该做的事情的后续步骤都将失败,并且你将得到一连串的错误.


ham*_*ish 13

这是我修复同样问题的方法,使用它来查看异常:

"" + e);
Run Code Online (Sandbox Code Playgroud)

当原始程序员抛出Exception对象而不实现时,这将帮助您 .getMessage();

我责怪Google允许使用null的Exception对象 getMessage();

当我的代码获得java.lang.NullPointerException 它时,它随后导致我的异常日志记录失败e.getMessage();

null.getMessage();给我造成了另一个未处理的异常而坠毁与强制关闭消息的应用程序.所以就是这样:

Log.e("MainLogger.Run.Exception", e.getMessage());
Run Code Online (Sandbox Code Playgroud)

我将其更改为此更正版本:

Log.e("MainLogger.Run.Exception", "" + e);
Run Code Online (Sandbox Code Playgroud)

现在它给了我一个很好的字符串返回 java.lang.NullPointerException

  • 为什么都是谷歌的错?“Exception”的 API 设计是由 Sun Microsystems 在 1990 年代完成的!因此决定从 JVM 中抛出带有“null”消息的 NPE。(Google 是这方面的好人,因为 Android 平台会抛出带有信息性消息的 NPE。) (3认同)

Mr *_*sel 5

想对哈米什的"" + e回答发表评论,但我没有足够的声誉点......

最好只使用e.toString()而不是"" + e. 结果是相同的,但在内部,后者可能会做更多不必要的连接工作,包括创建 StringBuilder、附加空白字符串、附加 e.toString() 的结果,然后转换回 String。有关 StringBuilder 幕后使用的详细信息,请参阅https://www.baeldung.com/java-strings-concatenation的“3. 加法运算符” 。

关于最初的问题,我建议使用 e.getString() (或者更好的是,执行完整的堆栈跟踪)而不是仅使用 e.getMessage()。对于某些异常,如果不知道异常类型,则该消息没有意义。我遇到的一个例子是 e.getMessage() 返回“-1”,但 e.toString() 返回“ArrayIndexOutOfBoundsException: -1”。您希望在日志中看到哪一个?:-)