【问题标题】:NullPointerException on not null object非空对象上的 NullPointerException
【发布时间】:2023-02-03 22:48:40
【问题描述】:

我有一个奇怪的问题:我正在调试我的应用程序并且我有这个 NullPointerException,但对象不是 null。

java.lang.NullPointerException
    at com.clh.model.margin.table.classes.ChMarginHeaderP.createCopy(Unknown Source)
    at com.clh.controller.builders.EccFirstCallBean.buildDefaultComponent(EccFirstCallBean.java:710)
    at com.clh.controller.builders.EccFirstCallBean.buildFirstCall(EccFirstCallBean.java:549)
    at com.clh.controller.builders.EccFirstCallBean.buildMargin(EccFirstCallBean.java:403)
    at com.clh.controller.builders.EccFirstCallBean.elabThirdLevel(EccFirstCallBean.java:268)
    at com.clh.controller.builders.EccFirstCallBeanTest.elabThirdLevelTest(EccFirstCallBeanTest.java:529)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:326)
    at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89)
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:97)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:310)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:131)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.access$100(PowerMockJUnit47RunnerDelegateImpl.java:59)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner$TestExecutorStatement.evaluate(PowerMockJUnit47RunnerDelegateImpl.java:147)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.evaluateStatement(PowerMockJUnit47RunnerDelegateImpl.java:107)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:298)
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87)
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:218)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:160)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:134)
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:136)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:117)
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:57)
    at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:542)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)

这就是我按 F5 进入并获取异常之前的内容:

【问题讨论】:

  • 然后检查它最初被扔在哪里。 NullPointerException 只有一个可能的来源:对类的未实例化实例采取的操作
  • 异常发生在ChMarginHeaderP.createCopy() 中的某处,但调试器无法获得其来源,因此无法提供更多详细信息。
  • 完全有可能ChMarginHeaderP.createCopy本身就有一行throw new NullPointerException()
  • 出于好奇,at com.clh.model.margin.table.classes.ChMarginHeaderP 来自哪个图书馆?我找不到任何相关信息,而且该域名似乎正在出售......

标签: java nullpointerexception


【解决方案1】:

堆栈跟踪的第一行是实际抛出 NPE 的地方。如您所见,它是不是在您突出显示的行上 - 这就是您调用 createCopy() 的地方,并且工作正常(因为 defaultChMarginHeaderP 不为空,正如您的调试器正确告诉您的那样)。这是一些代码里面createCopy() 显式抛出异常的调用(字面上,throw new NullPointerException() 在该方法中并且正在执行),或者其中的一些代码取消引用空指针。通常类似于 foo.methodCall(),其中 foonull。那是什么密码?不知道 - 您正在将 ChMarginHeaderP 作为类文件(而不是源文件)运行,并且类文件没有调试信息,因此,行号未知等等。

在没有此类调试信息的情况下进行调试意味着您必须阅读文档和四处游荡,“在黑暗中”找出您违反的 createCopy 方法的前提条件要求。

通常你有这个信息,它给你一个行号,你可以交叉检查 ChMarginHeaderP 的来源,然后你会更快地知道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 2017-08-25
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多