1

SonarQube がこのコードを分析しようとすると、NPE が発生します。

A.java

public class A<E extends A.B> {
  static class B {}
}

C.java

public class C<E> extends A<C.D<E>>{
  static class D<E> extends A.B {}
}

環境 :

  • ソナーキューブ 5.1.2
  • Sonar-java-plugin-3.4
  • Maven 3.2.5 (mvn ソナー:ソナー)

スタック :

java.lang.NullPointerException: null
  org.sonar.java.resolve.Resolve.findMemberType(Resolve.java:201) で ~[java-squid-3.4.jar:na]
  org.sonar.java.resolve.Resolve.findType(Resolve.java:222) で ~[java-squid-3.4.jar:na]
  org.sonar.java.resolve.Resolve.findIdent(Resolve.java:282) で ~[java-squid-3.4.jar:na]
  org.sonar.java.resolve.TypeAndReferenceSolver.resolveAs(TypeAndReferenceSolver.java:276) で ~[java-squid-3.4.jar:na]
  org.sonar.java.resolve.TypeAndReferenceSolver.resolveAs(TypeAndReferenceSolver.java:252) で ~[java-squid-3.4.jar:na]
  org.sonar.java.resolve.SecondPass.resolveType(SecondPass.java:223) で ~[java-squid-3.4.jar:na]
  org.sonar.java.resolve.SecondPass.populateSuperclass(SecondPass.java:123) で ~[java-squid-3.4.jar:na]
  org.sonar.java.resolve.SecondPass.complete(SecondPass.java:89) で ~[java-squid-3.4.jar:na]
  org.sonar.java.resolve.SecondPass.complete(SecondPass.java:60) で ~[java-squid-3.4.jar:na]
  org.sonar.java.resolve.JavaSymbol.complete(JavaSymbol.java:104) で ~[java-squid-3.4.jar:na]
  org.sonar.java.resolve.JavaType.getSymbol(JavaType.java:77) で ~[java-squid-3.4.jar:na]
  org.sonar.java.resolve.TypeAndReferenceSolver.visitParameterizedType(TypeAndReferenceSolver.java:350) で ~[java-squid-3.4.jar:na]
  org.sonar.java.model.JavaTree$ParameterizedTypeTreeImpl.accept(JavaTree.java:533) ~[java-squid-3.4.jar:na] で
  org.sonar.java.resolve.TypeAndReferenceSolver.resolveAs(TypeAndReferenceSolver.java:285) で ~[java-squid-3.4.jar:na]
  org.sonar.java.resolve.TypeAndReferenceSolver.resolveAs(TypeAndReferenceSolver.java:252) で ~[java-squid-3.4.jar:na]
  org.sonar.java.resolve.TypeAndReferenceSolver.resolveAs(TypeAndReferenceSolver.java:247) で ~[java-squid-3.4.jar:na]
  org.sonar.java.resolve.TypeAndReferenceSolver.resolveAs(TypeAndReferenceSolver.java:321) で ~[java-squid-3.4.jar:na]
  org.sonar.java.resolve.TypeAndReferenceSolver.visitParameterizedType(TypeAndReferenceSolver.java:345) で ~[java-squid-3.4.jar:na]
  org.sonar.java.model.JavaTree$ParameterizedTypeTreeImpl.accept(JavaTree.java:533) ~[java-squid-3.4.jar:na] で
  org.sonar.java.resolve.TypeAndReferenceSolver.resolveAs(TypeAndReferenceSolver.java:285) で ~[java-squid-3.4.jar:na]
  org.sonar.java.resolve.TypeAndReferenceSolver.resolveAs(TypeAndReferenceSolver.java:252) で ~[java-squid-3.4.jar:na]
  org.sonar.java.resolve.SecondPass.resolveType(SecondPass.java:223) で ~[java-squid-3.4.jar:na]
  org.sonar.java.resolve.SecondPass.populateSuperclass(SecondPass.java:123) で ~[java-squid-3.4.jar:na]
  org.sonar.java.resolve.SecondPass.complete(SecondPass.java:89) で ~[java-squid-3.4.jar:na]
  org.sonar.java.resolve.SecondPass.complete(SecondPass.java:60) で ~[java-squid-3.4.jar:na]
  org.sonar.java.resolve.JavaSymbol.complete(JavaSymbol.java:104) で ~[java-squid-3.4.jar:na]
  org.sonar.java.resolve.FirstPass.completeSymbols(FirstPass.java:90) で ~[java-squid-3.4.jar:na]
  org.sonar.java.resolve.FirstPass.visitCompilationUnit(FirstPass.java:121) で ~[java-squid-3.4.jar:na]
  org.sonar.java.resolve.SemanticModel.createFor(SemanticModel.java:67) で ~[java-squid-3.4.jar:na]
  org.sonar.java.model.VisitorsBridge.visitFile(VisitorsBridge.java:110) で ~[java-squid-3.4.jar:na]
  org.sonar.java.ast.JavaAstScanner.simpleScan(JavaAstScanner.java:94) [java-squid-3.4.jar:na] で
  org.sonar.java.ast.JavaAstScanner.scan(JavaAstScanner.java:75) [java-squid-3.4.jar:na] で
  org.sonar.java.JavaSquid.scanSources(JavaSquid.java:131) [java-squid-3.4.jar:na] で
  org.sonar.java.JavaSquid.scan(JavaSquid.java:124) [java-squid-3.4.jar:na] で
  org.sonar.plugins.java.JavaSquidSensor.analyse (JavaSquidSensor.java:86) で [sonar-java-plugin-3.4.jar:na]
  org.sonar.batch.phases.SensorsExecutor.executeSensor(SensorsExecutor.java:59) [sonar-batch-maven-compat-5.1.2.jar:na] で
  org.sonar.batch.phases.SensorsExecutor.execute (SensorsExecutor.java:51) で [sonar-batch-maven-compat-5.1.2.jar:na]
  org.sonar.batch.phases.DatabaseModePhaseExecutor.execute (DatabaseModePhaseExecutor.java:120) で [sonar-batch-maven-compat-5.1.2.jar:na]
  org.sonar.batch.scan.ModuleScanContainer.doAfterStart (ModuleScanContainer.java:264) で [sonar-batch-maven-compat-5.1.2.jar:na]
  org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:92) [ソナーバッチ-maven-compat-5.1.2.jar:na] で
  org.sonar.api.platform.ComponentContainer.execute (ComponentContainer.java:77) [ソナー-バッチ-maven-compat-5.1.2.jar:na] で
  org.sonar.batch.scan.ProjectScanContainer.scan (ProjectScanContainer.java:235) で [sonar-batch-maven-compat-5.1.2.jar:na]
  org.sonar.batch.scan.ProjectScanContainer.scanRecursively (ProjectScanContainer.java:230) [ソナー-バッチ-maven-compat-5.1.2.jar:na] で
  org.sonar.batch.scan.ProjectScanContainer.doAfterStart (ProjectScanContainer.java:220) で [sonar-batch-maven-compat-5.1.2.jar:na]
  org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:92) [ソナーバッチ-maven-compat-5.1.2.jar:na] で
  org.sonar.api.platform.ComponentContainer.execute (ComponentContainer.java:77) [ソナー-バッチ-maven-compat-5.1.2.jar:na] で
  org.sonar.batch.scan.ScanTask.scan (ScanTask.java:57) で [ソナー-バッチ-maven-compat-5.1.2.jar:na]
  org.sonar.batch.scan.ScanTask.execute (ScanTask.java:45) で [sonar-batch-maven-compat-5.1.2.jar:na]
  org.sonar.batch.bootstrap.TaskContainer.doAfterStart (TaskContainer.java:135) で [sonar-batch-maven-compat-5.1.2.jar:na]
  org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:92) [ソナーバッチ-maven-compat-5.1.2.jar:na] で
  org.sonar.api.platform.ComponentContainer.execute (ComponentContainer.java:77) [ソナー-バッチ-maven-compat-5.1.2.jar:na] で
  org.sonar.batch.bootstrap.GlobalContainer.executeTask (GlobalContainer.java:158) で [sonar-batch-maven-compat-5.1.2.jar:na]
  org.sonar.batch.bootstrapper.Batch.executeTask (Batch.java:95) で [sonar-batch-maven-compat-5.1.2.jar:na]
  org.sonar.batch.bootstrapper.Batch.execute (Batch.java:67) で [sonar-batch-maven-compat-5.1.2.jar:na]
  org.sonar.runner.batch.IsolatedLauncher.execute (IsolatedLauncher.java:48) で [sonar-runner-batch1248517138931767319.jar:na]
  at sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド) ~[na:1.8.0_60-ea]
  sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) で ~[na:1.8.0_60-ea]
  sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) で ~[na:1.8.0_60-ea]
  java.lang.reflect.Method.invoke(Method.java:497) で ~[na:1.8.0_60-ea]
  org.sonar.runner.impl.BatchLauncher$1.delegateExecution(BatchLauncher.java:87) [sonar-runner-api-2.4.jar:na] で
  org.sonar.runner.impl.BatchLauncher$1.run(BatchLauncher.java:75) [sonar-runner-api-2.4.jar:na] で
  java.security.AccessController.doPrivileged(ネイティブメソッド) [na:1.8.0_60-ea]
  org.sonar.runner.impl.BatchLauncher.doExecute (BatchLauncher.java:69) で [sonar-runner-api-2.4.jar:na]
  org.sonar.runner.impl.BatchLauncher.execute (BatchLauncher.java:50) で [sonar-runner-api-2.4.jar:na]
  org.sonar.runner.api.EmbeddedRunner.doExecute (EmbeddedRunner.java:102) で [sonar-runner-api-2.4.jar:na]
  org.sonar.runner.api.Runner.execute (Runner.java:100) で [sonar-runner-api-2.4.jar:na]
  org.codehaus.mojo.sonar.bootstrap.RunnerBootstraper.execute (RunnerBootstraper.java:135) で [sonar-maven-plugin-2.6.jar:na]
  org.codehaus.mojo.sonar.SonarMojo.execute (SonarMojo.java:132) で [sonar-maven-plugin-2.6.jar:na]
  org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:132) [maven-core-3.2.5.jar:3.2.5] で
  org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208) [maven-core-3.2.5.jar:3.2.5] で
  org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) [maven-core-3.2.5.jar:3.2.5] で
  org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) [maven-core-3.2.5.jar:3.2.5] で
  org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116) [maven-core-3.2.5.jar:3.2.5] で
  org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80) [maven-core-3.2.5.jar:3.2.5] で
  org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51) [maven-core-3.2.5.jar:3.2.5] で
  org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:120) [maven-core-3.2.5.jar:3.2.5] で
  org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:355) [maven-core-3.2.5.jar:3.2.5] で
  org.apache.maven.DefaultMaven.execute(DefaultMaven.java:155) [maven-core-3.2.5.jar:3.2.5] で
  org.apache.maven.cli.MavenCli.execute (MavenCli.java:584) [maven-embedder-3.2.5.jar:3.2.5] で
  org.apache.maven.cli.MavenCli.doMain(MavenCli.java:216) [maven-embedder-3.2.5.jar:3.2.5] で
  org.apache.maven.cli.MavenCli.main(MavenCli.java:160) [maven-embedder-3.2.5.jar:3.2.5] で
  at sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド) ~[na:1.8.0_60-ea]
  sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) で ~[na:1.8.0_60-ea]
  sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) で ~[na:1.8.0_60-ea]
  java.lang.reflect.Method.invoke(Method.java:497) で ~[na:1.8.0_60-ea]
  org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:289) [plexus-classworlds-2.5.2.jar:na] で
  org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229) [plexus-classworlds-2.5.2.jar:na] で
  org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415) [plexus-classworlds-2.5.2.jar:na] で
  org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356) [plexus-classworlds-2.5.2.jar:na] で
4

1 に答える 1

2

正確なコード スニペットを提供していただきありがとうございます。私は自分の側で問題を再現しましたが、SonarQube java pluginそのような状況では、パラメーター化された型の型解決に実際に問題があるようです。あなたが提供した情報のおかげで、問題を処理するために次のチケットを作成しました: http://jira.sonarsource.com/browse/SONARJAVA-1218

于 2015-08-12T15:44:39.293 に答える