Java 行中的NullPointerException

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

我们的JUnit测试有时会失败,原因如下:

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那么,它不是一个库,或者您直接使用源代码?在这种情况下,您需要发布完整的堆栈跟踪,以便我们可以看到创建位置(或为空)。我添加了堆栈跟踪(尽管我不确定如何从中看到位置为空)。代码不是外部库,而是我自己的。