在我的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
?
答案 0 :(得分:43)
您正在捕获除代码明确创建并抛出 1 之外的异常。您捕获的例外没有消息。您需要记录整个异常,而不仅仅是异常消息。 (除其他外,它会告诉你捕获的异常的实际类是什么以及创建/抛出异常的位置。)
基于异常没有消息的事实,我猜它是由stud
或acc
为空或由stud.getCall()
返回导致的NPE null
......或类似的东西。本地生成的NullPointerException
(即由JVM)生成null
消息 2 。
java.lang.Exception
是不良做法您的问题说明了为什么创建/抛出Exception
当您抛出Exception
时,几乎无法区分它与catch
子句中的其他(意外)异常。这就是这里发生的事情:你已经发现了错误的异常。
您应该选择一个更具体的例外,如果不存在合适的例外,请实施您自己的例外。
1 - 您还可以使用e.printStackTrace()
,记录器调用或调试器来查找实际捕获的异常。
2 - 在Android上不是这样。在那里,NPE有一条有用的信息,可以提供上下文信息。
答案 1 :(得分:16)
尝试打印异常,而不仅仅是消息,例如
logger.error("caught exception while doing whatever", e);
看看它的作用。只打印消息是一个混乱的秘诀。通过仅记录您丢弃堆栈跟踪的消息,其中行号指向导致异常的位置。现在你发现并非所有例外都包含一条消息。
抛出新异常是非常糟糕的,因为你丢弃了异常的原始类型,加上原始异常的堆栈跟踪。当你扔掉所有有用的信息时,你怎么能指出出了什么问题呢?如果你必须捕获异常以在此处记录它,那么重新抛出你捕获的同一异常,至少这样你就不会丢失堆栈跟踪。 (或者,您可以在构造函数调用中传入对原始异常的引用时抛出一个新异常。)
最好使用集中式异常处理程序,让它执行日志记录,并在意外异常处理之前不会被捕获。因为一旦某个东西抛出了意外的异常,你的应用程序处于错误的状态,任何依赖于这部分应该做的事情的后续步骤都会失败,并且你会得到一连串的错误。
答案 2 :(得分:10)
这是我修复同样问题的方法,使用它来查看异常:
"" + e);
当原始程序员抛出Exception对象而不实现.getMessage();
我责怪Google允许使用null getMessage();
当我的代码获得java.lang.NullPointerException
时
随后导致我的异常日志记录在e.getMessage();
来自null
的{{1}}导致了另一个未处理的异常,并使用强制关闭消息崩溃了应用程序。
所以就是这样:
.getMessage();
我将其更改为此更正版本:
Log.e("MainLogger.Run.Exception", e.getMessage());
现在它给了我一个很好的字符串返回Log.e("MainLogger.Run.Exception", "" + e);
答案 3 :(得分:1)
派对迟到了,但我敢打赌stud
为空,你得到的例外是NullPointerException
if (stud.getCall()....
。它是没有消息的例外之一,即null。
答案 4 :(得分:0)
代码看起来语法很好,e.getMessage()不应该为null,我编译相同的代码并在控制台上打印输出,它打印为"Some ErrorData is null"
,这很好。现在,您的记录器存在问题,或者您可能正在查看记录器文件中的错误行。
logger的问题可能是什么
这完全取决于您使用的记录器?你有没有重写looger.error()的方法?但是可以肯定的是,catch块中的e.getMessage()不为null。您也可以通过在catch块中的控制台上打印e.geMessage()来尝试。
答案 5 :(得分:0)
在调用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());
}
答案 6 :(得分:0)
我希望这对你有帮助....
如果要打印消息“Data is null”,则不要使用Build-in类“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”(编写这段代码的地方):
throw new DemoClass("Please check the Mandatory Field is Missing" + e.getMessage());
答案 7 :(得分:0)
想评论hamish的"" + 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”。您希望在日志中看到哪个? :-)
答案 8 :(得分:0)
在我的情况下,它返回带有空消息的错误Exception,因为我将方法调用的结果包装在Optional变量中:
这是对MongoRepository数据库操作的调用:
Optional<CustomerDB> result = Optional.of(repository.findByToken(token));
函数“ repository.findByToken(token)”只是返回一个CustomerDB对象。
我将代码行更改为:
CustomerDB result = repository.findByToken(token);
我得到了正确的消息例外。