Java 未捕获NullPointerException

Java 未捕获NullPointerException,java,reflection,nullpointerexception,Java,Reflection,Nullpointerexception,我正在使用Java反射: try { method.invoke(someObject); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NullPointerException e) { //Do something } method通过迭代getMethods()从“Set-getMethods=new-HashSet(Arrays.a

我正在使用Java反射:

try {
    method.invoke(someObject);
  } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NullPointerException e) {
    //Do something
  }
method
通过迭代
getMethods()
“Set-getMethods=new-HashSet(Arrays.asList(curObject.getClass().getMethods())”中检索。

someObject
不为null,但在方法调用中,它调用了导致
NullPointerException
的内容

但是,代码仍然会出现一个
NullPointerException
错误,堆栈跟踪指向“method.invoke(someObject);”


为什么接球不起作用?与反射有关吗?

您没有捕获异常的原因是它不是
NullPointerException
,而是
com.mapp.node.logging.exception.ConstructingFatalThrowableException
。此异常与消息(在异常名称后面)一起引发“java.lang.NullPointerException”,这是造成混淆的原因。尝试捕获
构造fatalthrowableexception
而不是NPE,并查看它是否有效


另外,请注意,您不应该捕获
NullPointerException
。这是一个
RuntimeException
,这组异常通常表示一个编程错误,在这种情况下,您不应该“处理”它,因为如果您知道它会发生,您应该避免错误。看看他们怎么说:

运行时异常表示的问题是由于 编程问题,因此,API客户端代码无法 合理预期从他们那里恢复或以任何方式处理他们 方式。这类问题包括算术异常,例如除以 零指针异常,例如试图通过 空引用(…)

记住这一点,只需避免出现
NullPointerException
。检查以下示例:

if(var!= null) {
    //Normal code here 
} 
else {
    //Handle the null pointer here
} 

如果我正确读取堆栈跟踪,则抛出的不是NullPointerException,而是
com.mapp.node.logging.exception.ConstructingFatalThrowableException
,并显示消息(可能是原因)“
java.lang.NullPointerException
”。
NullPointerException
堆栈跟踪的第一行实际上以
java.lang.NullPointerException
开头


要检查这一点,您可以将
ConstructingFatalThrowableException
添加到
catch
块中。

这不是NPE:它是一个
com.mapp.node.logging.exception.ConstructingFatalThrowableException,由一些在构建NPE时插入指令的时髦代码抛出

自下而上读取堆栈:

com.mapp.node.logging.exception.ConstructingFatalThrowableException: java.lang.NullPointerException
    at com.mapp.server.util.ExceptionInstrumentationUtil.handleFatalThrowable(ExceptionInstrumentationUtil.java:212)
    at com.mapp.server.util.ExceptionInstrumentationUtil.access$000(ExceptionInstrumentationUtil.java:32)
    at com.mapp.server.util.ExceptionInstrumentationUtil$2.sample(ExceptionInstrumentationUtil.java:164)
    at com.mapp.server.util.ExceptionInstrumentationUtil$2.sample(ExceptionInstrumentationUtil.java:160)
    at com.google.monitoring.runtime.instrumentation.ConstructorInstrumenter.invokeSamplers(ConstructorInstrumenter.java:207)
    at java.lang.RuntimeException.<init>(RuntimeException.java:52)
    at java.lang.NullPointerException.<init>(NullPointerException.java:60)
com.mapp.node.logging.exception.ConstructingFatalThrowableException:java.lang.NullPointerException
位于com.mapp.server.util.ExceptionInstrumentationUtil.HandleCataletrowable(ExceptionInstrumentUtil.java:212)
位于com.mapp.server.util.ExceptionInstrumentationUtil.access$000(ExceptionInstrumentUtil.java:32)
位于com.mapp.server.util.ExceptionInstrumentationUtil$2.sample(ExceptionInstrumentUtil.java:164)
位于com.mapp.server.util.ExceptionInstrumentationUtil$2.sample(ExceptionInstrumentUtil.java:160)
位于com.google.monitoring.runtime.instrumentation.ConstructorInstrumenter.invokeSamplers(ConstructorInstrumenter.java:207)
位于java.lang.RuntimeException。(RuntimeException.java:52)
位于java.lang.NullPointerException。(NullPointerException.java:60)
线程位于
NullPointerException.java:60
处,其中调用了
java.lang.RuntimeException.
(即超类构造函数),其中(位于
RuntimeException.java:52
)有一种JVM被检测为调用
com.google.monitoring.runtime.instrumentation.ConstructorInstrumenter.invokeSamplers
(我相信它取代了
super()
?)


无论如何-您的异常被抛出到
exceptioninstrumentutil.java:212

中,我认为您应该尝试以下方法:

 try
 { 
   // your code may error occures !!
 }
 catch(NullPointerException e)
{
//do your work here
}
catch(InvocationTargetException e)
{
//do your work here
}
catch(IllegalAccessException e)
{
//do your work here
}
catch(IllegalArgumentException e)
{
//do your work here
}
catch(Exception e)
{
//do your work here
}

这里所有的异常都被捕获到多个捕获块中。

如何定义
方法
,将整个代码与整个堆栈跟踪一起粘贴。Set getMethods=new HashSet(Arrays.asList(curObject.getClass().getMethods());这就是我如何得到一套方法。然后,我遍历它。我想粘贴它,但我不确定这是否违反政策,而不是在评论中!请更新您的问题!当您的捕获为空时,您如何知道引发了异常,从而立即丢弃所有错误信息?因为程序停止,并且控制台中显示nullpointer异常。此代码用于测试错误代码。我想使用反射来调用可能包含错误的代码,并将其报告给用户。实际上,我认为你错了。空指针与
NullPointerException
不同。后者可能是由前者引起的,但这并不意味着如果不抛出异常,空指针就不可能存在。如果
var
为空,则它不包含对任何对象的引用,因此它是空指针。正如上面引用的,文档中说,您不应该处理
NullPointerException
。因此,我建议您处理一个可能的空指针,而不是让异常被抛出。