StackOverflowError during "Find Usages"
- Dominant language
- Java
- Stars
- 3.1k
- Forks
- 935
- Avg merge
- 2d 3h
- Merged PRs (30d)
- 17
Description
### Apache NetBeans version
Apache NetBeans 22 release candidate
### What happened
Most likely due to https://github.com/apache/netbeans/pull/7153, a StackOverflowError happens when I select "Find Usages" on certain methods of our rather large Java project. As a result, no usages are found, even though there are many. It happens so many times that NetBeans is nearly unusable. As I like NB so much, I often fall back to the text-based "Find...", but that is not a decent replacement obviously.
Note that it is not really worse as compared to before https://github.com/apache/netbeans/pull/7153. Before, the same `NullPointerException: Cannot invoke "com.sun.tools.javac.code.Type.getThrownTypes() because "tree.meth.type" is null` error occurred as in https://github.com/apache/netbeans/issues/3725 but during "Find Usages". https://github.com/apache/netbeans/issues/3725 was supposed to be fixed by https://github.com/apache/netbeans/pull/7153.
It started about 2 years ago (I am always using the most recent NB version) but got worse and worse over time. Not sure if that was due to NB, changes in our code or both.
### Language / Project Type / NetBeans Component
Java multi-module Maven project
### How to reproduce
I created this issue as a heads-up to show probable consequences of https://github.com/apache/netbeans/pull/7153. I cannot send our code as it's proprietary and too large.
I will try to identify the culprit (I think it's about generics) and write simple classes to reproduce next.
### Did this work correctly in an earlier version?
No / Don't know
### Operating System
Windows 11
### JDK
Oracle JDK 11.0.22 for the project, Amazon Corretto OpenJDK 17.0.10 for NetBeans
### Apache NetBeans packaging
Apache NetBeans binary zip
### Anything else
The exception details are:
```
java.lang.IllegalStateException: java.lang.StackOverflowError
at com.sun.tools.javac.api.JavacTaskImpl.analyze(JavacTaskImpl.java:383)
at org.netbeans.modules.java.source.parsing.JavacParser.moveToPhase(JavacParser.java:765)
at org.netbeans.modules.java.source.parsing.CompilationInfoImpl.toPhase(CompilationInfoImpl.java:426)
at org.netbeans.api.java.source.CompilationController.toPhase(CompilationController.java:90)
at org.netbeans.modules.refactoring.java.plugins.JavaWhereUsedQueryPlugin$FindTask.run(JavaWhereUsedQueryPlugin.java:562)
at org.netbeans.modules.refactoring.java.plugins.JavaWhereUsedQueryPlugin$FindTask.run(JavaWhereUsedQueryPlugin.java:540)
at org.netbeans.modules.refactoring.java.spi.JavaRefactoringPlugin.lambda$processFiles$2(JavaRefactoringPlugin.java:330)
at org.netbeans.api.java.source.JavaSource$MultiTask.run(JavaSource.java:504)
at org.netbeans.modules.parsing.impl.TaskProcessor.callUserTask(TaskProcessor.java:586)
at org.netbeans.modules.parsing.api.ParserManager$MultiUserTaskAction.run(ParserManager.java:235)
at org.netbeans.modules.parsing.api.ParserManager$MultiUserTaskAction.run(ParserManager.java:205)
at org.netbeans.modules.parsing.impl.TaskProcessor$2.call(TaskProcessor.java:181)
at org.netbeans.modules.parsing.impl.TaskProcessor$2.call(TaskProcessor.java:178)
at org.netbeans.modules.masterfs.filebasedfs.utils.FileChangedManager.priorityIO(FileChangedManager.java:153)
at org.netbeans.modules.masterfs.providers.ProvidedExtensions.priorityIO(ProvidedExtensions.java:335)
at org.netbeans.modules.parsing.nb.DataObjectEnvFactory.runPriorityIO(DataObjectEnvFactory.java:118)
at org.netbeans.modules.parsing.impl.Utilities.runPriorityIO(Utilities.java:67)
at org.netbeans.modules.parsing.impl.TaskProcessor.runUserTask(TaskProcessor.java:178)
at org.netbeans.modules.parsing.api.ParserManager.parse(ParserManager.java:85)
at org.netbeans.api.java.source.JavaSource.runUserActionTaskImpl(JavaSource.java:454)
at org.netbeans.api.java.source.JavaSource.runUserActionTask(JavaSource.java:425)
at org.netbeans.modules.refactoring.java.spi.JavaRefactoringPlugin.processFiles(JavaRefactoringPlugin.java:328)
at org.netbeans.modules.refactoring.java.spi.JavaRefactoringPlugin.processFiles(JavaRefactoringPlugin.java:264)
at org.netbeans.modules.refactoring.java.spi.JavaRefactoringPlugin.queryFiles(JavaRefactoringPlugin.java:254)
at org.netbeans.modules.refactoring.java.plugins.JavaWhereUsedQueryPlugin.prepare(JavaWhereUsedQueryPlugin.java:353)
at org.netbeans.modules.refactoring.api.AbstractRefactoring.pluginsPrepare2(AbstractRefactoring.java:417)
at org.netbeans.modules.refactoring.api.AbstractRefactoring.pluginsPrepare(AbstractRefactoring.java:401)
at org.netbeans.modules.refactoring.api.AbstractRefactoring.prepare(AbstractRefactoring.java:212)
at org.netbeans.modules.refactoring.spi.impl.ParametersPanel$Prepare$2.run(ParametersPanel.java:1059)
at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1420)
at org.netbeans.modules.openide.util.GlobalLookup.execute(GlobalLookup.java:45)
at org.openide.util.lookup.Lookups.executeWith(Lookups.java:287)
at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:2035)
Caused by: java.lang.StackOverflowError
at com.sun.tools.javac.code.Types.isSubtype(Types.java:1082)
at com.sun.tools.javac.code.Types.isSubtype(Types.java:1074)
at com.sun.tools.javac.code.Types.isSuperType(Types.java:1301)
at com.sun.tools.javac.code.Types.isSubtype(Types.java:1083)
at com.sun.tools.javac.code.Types.isSubtype(Types.java:1074)
at com.sun.tools.javac.code.Types.isSuperType(Types.java:1301)
at com.sun.tools.javac.code.Types.isSubtype(Types.java:1083)
at com.sun.tools.javac.code.Types.isSubtype(Types.java:1074)
at com.sun.tools.javac.code.Types.isSuperType(Types.java:1301)
at com.sun.tools.javac.code.Types.isSubtype(Types.java:1083)
at com.sun.tools.javac.code.Types.isSubtype(Types.java:1074)
at com.sun.tools.javac.code.Types.isSuperType(Types.java:1301)
...
```
With NetBeans 21, it was:
```
java.lang.IllegalStateException: java.lang.NullPointerException: Cannot invoke "com.sun.tools.javac.code.Type.getThrownTypes()" because "tree.meth.type" is null
at com.sun.tools.javac.api.JavacTaskImpl.analyze(JavacTaskImpl.java:383)
at org.netbeans.modules.java.source.parsing.JavacParser.moveToPhase(JavacParser.java:765)
at org.netbeans.modules.java.source.parsing.CompilationInfoImpl.toPhase(CompilationInfoImpl.java:426)
at org.netbeans.api.java.source.CompilationController.toPhase(CompilationController.java:90)
at org.netbeans.modules.refactoring.java.plugins.JavaWhereUsedQueryPlugin$FindTask.run(JavaWhereUsedQueryPlugin.java:562)
at org.netbeans.modules.refactoring.java.plugins.JavaWhereUsedQueryPlugin$FindTask.run(JavaWhereUsedQueryPlugin.java:540)
at org.netbeans.modules.refactoring.java.spi.JavaRefactoringPlugin.lambda$processFiles$2(JavaRefactoringPlugin.java:330)
at org.netbeans.api.java.source.JavaSource$MultiTask.run(JavaSource.java:504)
at org.netbeans.modules.parsing.impl.TaskProcessor.callUserTask(TaskProcessor.java:586)
at org.netbeans.modules.parsing.api.ParserManager$MultiUserTaskAction.run(ParserManager.java:169)
at org.netbeans.modules.parsing.api.ParserManager$MultiUserTaskAction.run(ParserManager.java:140)
at org.netbeans.modules.parsing.impl.TaskProcessor$2.call(TaskProcessor.java:181)
at org.netbeans.modules.parsing.impl.TaskProcessor$2.call(TaskProcessor.java:178)
at org.netbeans.modules.masterfs.filebasedfs.utils.FileChangedManager.priorityIO(FileChangedManager.java:153)
at org.netbeans.modules.masterfs.providers.ProvidedExtensions.priorityIO(ProvidedExtensions.java:335)
at org.netbeans.modules.parsing.nb.DataObjectEnvFactory.runPriorityIO(DataObjectEnvFactory.java:118)
at org.netbeans.modules.parsing.impl.Utilities.runPriorityIO(Utilities.java:67)
at org.netbeans.modules.parsing.impl.TaskProcessor.runUserTask(TaskProcessor.java:178)
at org.netbeans.modules.parsing.api.ParserManager.parse(ParserManager.java:85)
at org.netbeans.api.java.source.JavaSource.runUserActionTaskImpl(JavaSource.java:454)
at org.netbeans.api.java.source.JavaSource.runUserActionTask(JavaSource.java:425)
at org.netbeans.modules.refactoring.java.spi.JavaRefactoringPlugin.processFiles(JavaRefactoringPlugin.java:328)
at org.netbeans.modules.refactoring.java.spi.JavaRefactoringPlugin.processFiles(JavaRefactoringPlugin.java:264)
at org.netbeans.modules.refactoring.java.spi.JavaRefactoringPlugin.queryFiles(JavaRefactoringPlugin.java:254)
at org.netbeans.modules.refactoring.java.plugins.JavaWhereUsedQueryPlugin.prepare(JavaWhereUsedQueryPlugin.java:353)
at org.netbeans.modules.refactoring.api.AbstractRefactoring.pluginsPrepare2(AbstractRefactoring.java:417)
at org.netbeans.modules.refactoring.api.AbstractRefactoring.pluginsPrepare(AbstractRefactoring.java:401)
at org.netbeans.modules.refactoring.api.AbstractRefactoring.prepare(AbstractRefactoring.java:212)
at org.netbeans.modules.refactoring.spi.impl.ParametersPanel$Prepare$2.run(ParametersPanel.java:1059)
at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1420)
at org.netbeans.modules.openide.util.GlobalLookup.execute(GlobalLookup.java:45)
at org.openide.util.lookup.Lookups.executeWith(Lookups.java:287)
at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:2035)
Caused by: java.lang.NullPointerException: Cannot invoke "com.sun.tools.javac.code.Type.getThrownTypes()" because "tree.meth.type" is null
at com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitApply(Flow.java:1769)
at com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1816)
at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
at com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:455)
at com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitReturn(Flow.java:1745)
at com.sun.tools.javac.tree.JCTree$JCReturn.accept(JCTree.java:1728)
at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
at com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:455)
at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:58)
at com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitBlock(Flow.java:1494)
at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:1092)
at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
at com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:455)
at com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitMethodDef(Flow.java:1460)
at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:916)
at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
at com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:455)
at com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitClassDef(Flow.java:1423)
at com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:814)
at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
at com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:455)
at com.sun.tools.javac.comp.Flow$FlowAnalyzer.analyzeTree(Flow.java:1862)
at com.sun.tools.javac.comp.Flow$FlowAnalyzer.analyzeTree(Flow.java:1852)
at com.sun.tools.javac.comp.Flow.analyzeTree(Flow.java:231)
at com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1419)
at com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1383)
at com.sun.tools.javac.api.JavacTaskImpl.analyze(JavacTaskImpl.java:404)
at com.sun.tools.javac.api.JavacTaskImpl.lambda$analyze$1(JavacTaskImpl.java:379)
at com.sun.tools.javac.api.JavacTaskImpl.invocationHelper(JavacTaskImpl.java:152)
at com.sun.tools.javac.api.JavacTaskImpl.analyze(JavacTaskImpl.java:379)
... 32 more
```
### Are you willing to submit a pull request?
No
Contributor guide
Research direction
Start at JavaWhereUsedQueryPlugin$FindTask and follow the stack through JavacParser.moveToPhase and CompilationInfoImpl.toPhase. Reproduce the failure with a minimal Java project, focusing on the reported generic-type scenario; done means Find Usages completes without StackOverflowError and reports usages instead of failing.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java
- Domain
- tooling
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 32/100