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的地方。)

基于这个例外没有消息的事实,我猜测这是由studacc为空,或通过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是NullPointerExceptionif (stud.getCall()....这是一个例外,往往没有消息,即空。

代码看起来很好的语法明智和e.getMessage()不应该为空,我编译相同的代码,并在控制台上打印输出,它打印为"Some ErrorData is null"这是好的。 现在无论是你的logging器的问题,或者你可能正在看日志文件中的错误的行。

logging器有什么问题

它完全取决于你使用哪个logging器? 你有没有重写looger.error()的方法? 但是确实的是,catch块中的e.getMessage()不是空的。 您也可以通过在控制台上的catch块中打印e.geMes​​sage()来尝试。

在调用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());