Exception.getMessage()为null
在我的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
?
你正在捕获一个exception,而不是你的代码明确创build和抛出的exception。 你正在捕捉的exception没有消息。 您需要logging整个exception,而不仅仅是exception的消息。 (除此之外,它会告诉你被捕获的exception的实际类是什么,以及创build/抛出exception的地方。)
基于这个例外没有消息的事实,我猜测这是由stud
或acc
为空,或通过stud.getCall()
返回null
或类似的东西引起的NPE。 本机生成的NullPointerException
(即由JVM)具有null
消息1 。
抛出java.lang.Exception
是不好的做法
你的问题说明了为什么一般来说创build/抛出Exception
是一个坏主意
当抛出Exception
,在catch
子句中区分它和其他(意外的)exception几乎是不可能的。 这就是发生在这里的事情:你发现了一个错误的例外。
你应该select一个更具体的例外,如果没有适当的例外,实施你自己的。
1 – 这在Android上不是这样。 在那里,一个NPE有一个有用的信息,提供上下文信息。
尝试打印exception,而不仅仅是消息
logger.error("caught exception while doing whatever", e);
并看看它做了什么。 只是打印信息是一个混淆的秘诀。 通过仅logging消息,您将丢弃堆栈跟踪的行号指向导致exception的地方。 现在你已经发现并不是所有的例外都包含一条消息。
抛出新的exception是非常糟糕的,因为你扔掉了原来的exceptiontypes,加上原始exception的堆栈跟踪。 当你扔掉所有有用的信息的时候,你如何预测弄错了什么? 如果您必须捕获exception并将其logging到此处,请重新引发您捕获的exception,至less您不会丢失堆栈跟踪。 (或者,您可以在构造函数调用中传递对原始exception的引用时抛出一个新的exception。)
你最好使用一个集中的exception处理程序,让它进行日志logging,并有意外的exception直到他们到达处理程序。 因为一旦某事引发了一个意想不到的exception,那么你的应用程序就处于不良状态,任何依赖于这个部分应该做的事情的后续步骤将会失败,并且你将会得到一连串的错误。
这是我如何解决同样的问题,用这个来看exception:
"" + e);
当原程序员抛出一个Exception对象而不实现.getMessage();
我怪谷歌允许与空getMessage();
exception对象getMessage();
当我的代码得到一个java.lang.NullPointerException
它随后导致我的exception日志logging失败e.getMessage();
.getMessage();
null
.getMessage();
导致我另一个未处理的exception,并强制closures消息崩溃的应用程序。 所以是这样的:
Log.e("MainLogger.Run.Exception", e.getMessage());
我将其更改为此更正的版本:
Log.e("MainLogger.Run.Exception", "" + e);
现在它给了我一个不错的string返回java.lang.NullPointerException
这是晚了党,但我敢打赌stud
是空的,你得到的exception是NullPointerException
在if (stud.getCall()....
这是一个例外,往往没有消息,即空。
代码看起来很好的语法明智和e.getMessage()不应该为空,我编译相同的代码,并在控制台上打印输出,它打印为"Some ErrorData is null"
这是好的。 现在无论是你的logging器的问题,或者你可能正在看日志文件中的错误的行。
logging器有什么问题
它完全取决于你使用哪个logging器? 你有没有重写looger.error()的方法? 但是确实的是,catch块中的e.getMessage()不是空的。 您也可以通过在控制台上的catch块中打印e.geMessage()来尝试。
在调用getMessage()之前调用printStackTrace()。 这个方法
将这个Throwable堆栈跟踪的可打印表示写入System.errstream。
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()); }
我希望这可以帮助你…
如果要打印“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”:
throw new DemoClass("Please check the Mandatory Field is Missing" + e.getMessage());