NPEs in build logs for classes that contain switch expressions

Versions used:

  • Sonarcloud
  • Gradle 6.6.1 with ‘org.sonarqube’ plugin (version ‘2.8’)
  • Java compiler source and target versions are Java 14
  • Build and analysis runs on AdoptOpenJDK jdk-14+36

In build logs the following similar stack traces can be seen for a small number of classes:

Unable to run check class org.sonar.java.se.SymbolicExecutionVisitor -  on file 'src/main/java/com/company/core/domain/ClassName.java', To help improve the SonarSource Java Analyzer, please report this problem to SonarSource: see https://community.sonarsource.com/
java.lang.NullPointerException: null
	at java.base/java.util.Objects.requireNonNull(Objects.java:222)
	at org.sonar.java.collections.AVLTree.get(AVLTree.java:76)
	at org.sonar.java.se.ProgramState.removeConstraintsOnDomain(ProgramState.java:320)
	at org.sonar.java.se.checks.StreamConsumedCheck.checkPostStatement(StreamConsumedCheck.java:212)
	at org.sonar.java.se.CheckerDispatcher.executePost(CheckerDispatcher.java:106)
	at org.sonar.java.se.CheckerDispatcher.addTransition(CheckerDispatcher.java:97)
	at org.sonar.java.se.CheckerDispatcher.executePost(CheckerDispatcher.java:118)
	at org.sonar.java.se.CheckerDispatcher.addTransition(CheckerDispatcher.java:97)
	at org.sonar.java.se.CheckerDispatcher.executePost(CheckerDispatcher.java:118)
	at org.sonar.java.se.CheckerDispatcher.addTransition(CheckerDispatcher.java:97)
	at org.sonar.java.se.CheckerDispatcher.executePost(CheckerDispatcher.java:118)
	at org.sonar.java.se.CheckerDispatcher.addTransition(CheckerDispatcher.java:97)
	at org.sonar.java.se.CheckerDispatcher.executePost(CheckerDispatcher.java:118)
	at org.sonar.java.se.CheckerDispatcher.addTransition(CheckerDispatcher.java:97)
	at org.sonar.java.se.CheckerDispatcher.executePost(CheckerDispatcher.java:118)
	at org.sonar.java.se.CheckerDispatcher.addTransition(CheckerDispatcher.java:97)
	at org.sonar.java.se.CheckerDispatcher.executePost(CheckerDispatcher.java:118)
	at org.sonar.java.se.CheckerDispatcher.addTransition(CheckerDispatcher.java:97)
	at org.sonar.java.se.checks.NullDereferenceCheck.checkPostStatement(NullDereferenceCheck.java:234)
	at org.sonar.java.se.CheckerDispatcher.executePost(CheckerDispatcher.java:106)
	at org.sonar.java.se.CheckerDispatcher.addTransition(CheckerDispatcher.java:97)
	at org.sonar.java.se.CheckerDispatcher.executeCheckPostStatement(CheckerDispatcher.java:69)
	at org.sonar.java.se.ExplodedGraphWalker.execute(ExplodedGraphWalker.java:270)
	at org.sonar.java.se.ExplodedGraphWalker.visitMethod(ExplodedGraphWalker.java:224)
	at org.sonar.java.se.SymbolicExecutionVisitor.execute(SymbolicExecutionVisitor.java:73)
	at org.sonar.java.se.SymbolicExecutionVisitor.visitNode(SymbolicExecutionVisitor.java:63)
	at org.sonar.java.ast.visitors.SubscriptionVisitor.visit(SubscriptionVisitor.java:103)
	at org.sonar.java.ast.visitors.SubscriptionVisitor.visitChildren(SubscriptionVisitor.java:128)
	at org.sonar.java.ast.visitors.SubscriptionVisitor.visit(SubscriptionVisitor.java:105)
	at org.sonar.java.ast.visitors.SubscriptionVisitor.visitChildren(SubscriptionVisitor.java:128)
	at org.sonar.java.ast.visitors.SubscriptionVisitor.visit(SubscriptionVisitor.java:105)
	at org.sonar.java.ast.visitors.SubscriptionVisitor.scanTree(SubscriptionVisitor.java:86)
	at org.sonar.java.ast.visitors.SubscriptionVisitor.scanFile(SubscriptionVisitor.java:72)
	at org.sonar.java.se.SymbolicExecutionVisitor.scanFile(SymbolicExecutionVisitor.java:53)
	at org.sonar.java.model.VisitorsBridge.lambda$runScanner$0(VisitorsBridge.java:180)
	at org.sonar.java.model.VisitorsBridge.runScanner(VisitorsBridge.java:185)
	at org.sonar.java.model.VisitorsBridge.runScanner(VisitorsBridge.java:180)
	at org.sonar.java.model.VisitorsBridge.visitFile(VisitorsBridge.java:151)
	at org.sonar.java.ast.JavaAstScanner.simpleScan(JavaAstScanner.java:98)
	at org.sonar.java.ast.JavaAstScanner.scan(JavaAstScanner.java:64)
	at org.sonar.java.JavaSquid.scanSources(JavaSquid.java:114)
	at org.sonar.java.JavaSquid.scan(JavaSquid.java:107)
	at org.sonar.plugins.java.JavaSquidSensor.execute(JavaSquidSensor.java:103)
	at org.sonar.scanner.sensor.AbstractSensorWrapper.analyse(AbstractSensorWrapper.java:45)
	at org.sonar.scanner.sensor.ModuleSensorsExecutor.execute(ModuleSensorsExecutor.java:75)
	at org.sonar.scanner.sensor.ModuleSensorsExecutor.lambda$execute$1(ModuleSensorsExecutor.java:48)
	at org.sonar.scanner.sensor.ModuleSensorsExecutor.withModuleStrategy(ModuleSensorsExecutor.java:66)
	at org.sonar.scanner.sensor.ModuleSensorsExecutor.execute(ModuleSensorsExecutor.java:48)
	at org.sonar.scanner.scan.ModuleScanContainer.doAfterStart(ModuleScanContainer.java:68)
	at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:122)
	at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:108)
	at org.sonar.scanner.scan.ProjectScanContainer.scan(ProjectScanContainer.java:421)
	at org.sonar.scanner.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:417)
	at org.sonar.scanner.scan.ProjectScanContainer.doAfterStart(ProjectScanContainer.java:375)
	at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:122)
	at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:108)
	at org.sonar.scanner.bootstrap.GlobalContainer.doAfterStart(GlobalContainer.java:126)
	at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:122)
	at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:108)
	at org.sonar.batch.bootstrapper.Batch.doExecute(Batch.java:58)
	at org.sonar.batch.bootstrapper.Batch.execute(Batch.java:52)
	at org.sonarsource.scanner.api.internal.batch.BatchIsolatedLauncher.execute(BatchIsolatedLauncher.java:46)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:564)
	at org.sonarsource.scanner.api.internal.IsolatedLauncherProxy.invoke(IsolatedLauncherProxy.java:60)
	at com.sun.proxy.$Proxy81.execute(Unknown Source)
	at org.sonarsource.scanner.api.EmbeddedScanner.doExecute(EmbeddedScanner.java:189)
	at org.sonarsource.scanner.api.EmbeddedScanner.execute(EmbeddedScanner.java:138)
	at org.sonarqube.gradle.SonarQubeTask.run(SonarQubeTask.java:100)

What all of those classes have in common is switch expressions that look like this:

        return switch (itemType) {
            case SOME_TYPE -> 123;
            case ANOTHER_TYPE  -> 456;
        };

Hello @grimsa,

Thanks for the feedback, I created the following ticket to handle this: SONARJAVA-3541

The fix will be part of our next Java Analyzer release, to be deployed on SonarCloud in 1-2 weeks.

Cheers,
Michael

1 Like

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.