在我的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 stud或acc为空,或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
想对哈米什的"" + 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”。您希望在日志中看到哪一个?:-)
| 归档时间: |
|
| 查看次数: |
81246 次 |
| 最近记录: |