Java 未捕获NullPointerException
我正在使用Java反射: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
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
。因此,我建议您处理一个可能的空指针,而不是让异常被抛出。