Java 行中的NullPointerException
我们的JUnit测试有时会失败,原因如下:Java 行中的NullPointerException,java,nullpointerexception,Java,Nullpointerexception,我们的JUnit测试有时会失败,原因如下: Caused by: java.lang.NullPointerException at org.languagetool.rules.patterns.PatternRuleMatcher.formatMatches(PatternRuleMatcher.java:300) at org.languagetool.rules.patterns.PatternRuleMatcher.createRuleMatch(PatternRule
Caused by: java.lang.NullPointerException
at org.languagetool.rules.patterns.PatternRuleMatcher.formatMatches(PatternRuleMatcher.java:300)
at org.languagetool.rules.patterns.PatternRuleMatcher.createRuleMatch(PatternRuleMatcher.java:158)
[...]
第300行是这样的:
if (j >= positions.size()) {
j
是一个int
,位置
是列表
,两者都是局部变量。这怎么会导致NullPointerException?我看不出代码中有什么地方
位置
始终设置为null
。它用新的ArrayList(tokens.length+1)
初始化。实际上,如果我在异常发生的前一行添加if(positions==null){…}
,IntelliJ甚至会将positions==null
标记为警告,并告诉我这将始终是false
软件使用线程,但由于这两个变量都是局部变量,所以这不重要。问题很少发生,我必须运行测试30-40次才能解决问题
这里发生了什么,Java给出的代码行可以关闭吗?(我确信我正在查找正确的文件和版本,该文件也不会经常更改)
这是使用Java1.8.0_51实现的。完整的代码可以在
更新:根据要求完成堆栈跟踪:
testRules(org.languagetool.rules.ca.CatalanPatternRuleTest) Time elapsed: 29.978 sec <<< ERROR!
java.lang.RuntimeException: Error analyzing sentence: '<S> Va[anar/VAIP3S00,Va/_GV_] haver[haver/VAN00000,heure/VMN00000,haver/_GV_] una[un/DI0FS0,una/_GN_FS] reunió[reunió/NCFS000,reunió/_GN_FS].[</S>./_PUNCT]'
at org.languagetool.rules.patterns.PatternRule.match(PatternRule.java:191)
at org.languagetool.rules.patterns.PatternRuleTest.getMatches(PatternRuleTest.java:462)
at org.languagetool.rules.patterns.PatternRuleTest.testBadSentences(PatternRuleTest.java:294)
at org.languagetool.rules.patterns.PatternRuleTest.testGrammarRulesFromXML(PatternRuleTest.java:252)
at org.languagetool.rules.patterns.PatternRuleTest.runTestForLanguage(PatternRuleTest.java:187)
at org.languagetool.rules.patterns.PatternRuleTest.runGrammarRuleForLanguage(PatternRuleTest.java:103)
at org.languagetool.rules.patterns.PatternRuleTest.runGrammarRulesFromXmlTest(PatternRuleTest.java:91)
at org.languagetool.rules.ca.CatalanPatternRuleTest.testRules(CatalanPatternRuleTest.java:28)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at junit.framework.TestCase.runTest(TestCase.java:176)
at junit.framework.TestCase.runBare(TestCase.java:141)
at junit.framework.TestResult$1.protect(TestResult.java:122)
at junit.framework.TestResult.runProtected(TestResult.java:142)
at junit.framework.TestResult.run(TestResult.java:125)
at junit.framework.TestCase.run(TestCase.java:129)
at junit.framework.TestSuite.runTest(TestSuite.java:252)
at junit.framework.TestSuite.run(TestSuite.java:247)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:86)
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:283)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:173)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:128)
at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
Caused by: java.lang.NullPointerException
at org.languagetool.rules.patterns.PatternRuleMatcher.formatMatches(PatternRuleMatcher.java:300)
at org.languagetool.rules.patterns.PatternRuleMatcher.createRuleMatch(PatternRuleMatcher.java:158)
at org.languagetool.rules.patterns.PatternRuleMatcher.match(PatternRuleMatcher.java:136)
at org.languagetool.rules.patterns.PatternRule.match(PatternRule.java:187)
... 27 more
testRules(org.languagetool.rules.ca.CatalanPatternRuleTest)运行时间:29.978秒如果您完全确定用于构建库的源文件,则只能依赖stacktrace中的行号
在您的情况下,所涉及的文件最近发生了更改。事实上,第300行的内容发生了变化:
这个故事的寓意是:除非您拥有原始源代码,否则不要信任堆栈跟踪行号。Java 7没有出现此问题,Java 1.8.0\u 60也不再出现此问题。因此,这实际上是一个JVM错误,可能是这样的:如果变量位置的值为null
,那么该行可以并且将导致NullPointerException
。如果NPE被抛出到指定的行,则必须是这种情况。既然你觉得不太可能,那就考虑一下你看错路线的可能性。例如,如果您使用的类文件是从不同版本的源代码生成的,则可能会发生这种情况。请在调试器中运行并亲自查看?@bmargulies到目前为止,只有在命令行上运行测试时才发生错误,而不是在调试器中,但该更改是对该问题的反应。我一小时前刚收到一个异常,行号是300,当前版本的文件中的第300行是if(j>=positions.size()){
-正如我写的那样(在更改之前,根据stacktrace,错误在第299行)@DanielNaber那么,它不是一个库,或者您直接使用源代码?在这种情况下,您需要发布完整的堆栈跟踪,以便我们可以看到创建位置(或为空)。我添加了堆栈跟踪(尽管我不确定如何从中看到位置为空)。代码不是外部库,而是我自己的。