Java 异常。getMessage()为空

Java 异常。getMessage()为空,java,exception,Java,Exception,在我的Java代码中,它正在检查!null条件并引发异常 比如说 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()); th

在我的Java代码中,它正在检查
!null
条件并引发异常

比如说

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

当消息写入标准输出时,堆栈跟踪正在写入日志。我的假设是,你没有权限查看stdout被写入的任何内容,所以现在没有什么可以继续了。(即使你现在确实有权看到它,你也有两件不同的东西要拼凑在一起。)

大多数日志库都可以记录stacktrace。这样,您可以将所有有用的信息放在一起,将异常添加到日志中,而不仅仅是消息,如

logger.error("caught exception while doing whatever", e);
堆栈跟踪包含异常消息,加上指向导致异常的位置的行号,并显示过程中的每个调用,因此非常有用。现在您已经发现,并非所有异常都包含消息

如果您正在登录的任何对象都无法处理异常堆栈跟踪信息的写入,则有代码将堆栈跟踪作为字符串写入

发布的代码抛出新异常的方式非常糟糕,因为您正在丢弃原始异常类型以及原始异常的stacktrace。当你扔掉所有有用的信息时,你希望如何找出哪里出了问题?如果必须捕获异常才能将其记录在此处,那么请重新调用捕获的相同异常,或者将原始异常作为原因传递给新异常(请查看可丢弃的构造函数参数),至少这样不会丢失stacktrace


您最好使用一个集中式异常处理程序,让它进行日志记录,并让意外异常在到达处理程序之前不被破坏。因为一旦有东西抛出意外的异常,您的应用程序就会处于错误状态,任何依赖于此部分本应执行的操作的后续步骤都将失败,并且您将得到一系列错误。

代码的语法似乎很好,e.getMessage()不应为null,我编译了相同的代码并在控制台上打印了输出,它打印为“某些错误数据为空”,这很好。现在,要么您的记录器有问题,要么您可能在记录器文件中看到错误的行

记录器可能有什么问题

这完全取决于您使用的是哪个记录器?您是否重写了looger.error()的方法?但是,可以肯定的是,catch块中的e.getMessage()不为null。您还可以通过在控制台上的catch块中打印e.geMessage()来尝试这一点。

您捕获的异常与代码显式创建并抛出的异常不同1。您捕获的异常没有消息

您需要记录整个异常,而不仅仅是异常的消息。除此之外,这将告诉您捕获的异常的实际类是什么,以及异常是在哪里创建/抛出的

基于异常没有消息这一事实,我猜它是由
stud
acc
为null或
stud.getCall()
返回
null
引起的NPE。。。或者类似的。本机(即JVM)生成的
NullPointerException
具有
null
消息2


抛出
java.lang.Exception
是不好的做法 您的问题说明了为什么创建/抛出异常通常是个坏主意

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

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


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

2-这在Android上是不正确的。在那里,NPE有一条提供上下文信息的有用信息。在Java14及更高版本中也不再如此;请参见和

派对迟到了,但我敢打赌
stud
为null,而您在
if(stud.getCall()…
处得到的异常是
NullPointerException
。这是一个通常没有消息的异常,即null。

这是我修复相同问题的方式,使用此来查看异常:

"" + e);
当原始程序员在未实现
.getMessage();

我指责谷歌允许异常对象为null
getMessage();

当我的代码得到一个
java.lang.NullPointerException
它随后导致我在
e.getMessage();

.getMessage();
中的
null
导致我出现另一个未经处理的异常,并通过强制关闭消息使应用程序崩溃。 就是这个,

Log.e("MainLogger.Run.Exception", e.getMessage());
我把它改成了正确的版本:

Log.e("MainLogger.Run.Exception", "" + e);
现在,在调用getMessage()调用printStackTrace()之前,它给了我一个返回的字符串
java.lang.NullPointerException

将此可丢弃堆栈跟踪的可打印表示形式写入 System.err流


我希望这能帮助你

如果您想打印消息“Data is null”,那么不要使用内置类“Exception”,而是尝试使用编写此代码的类的名称。 例如: 如果类名为“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());}

如果您正在抛出,那么不要忘了在函数(编写此代码的地方)旁边提到“抛出DemoClass”:


想对哈米什的
“+e
答案发表评论,但我没有足够的声誉
 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());}
 throw new DemoClass("Please check the Mandatory Field is Missing" + e.getMessage());
 Optional<CustomerDB> result = Optional.of(repository.findByToken(token));
CustomerDB result = repository.findByToken(token);