nullpointerexceptionjavadocandroid-studio-arctic-fox

Android studio JavaDoc error throws a NullPointerException


Android studio cannot create JavaDoc. It throws a null pointer exception and cannot identify any of the android packed items.

...
/home/<user>/AndroidStudioProjects/<project>/app/src/main/java/com/example/simpleparadox/listycity/MainActivity.java:14: error: cannot access ViewGroup
public class MainActivity extends AppCompatActivity {
       ^
  class file for android.view.ViewGroup not found
javadoc: error - fatal error encountered: java.lang.NullPointerException
javadoc: error - Please file a bug against the javadoc tool via the Java bug reporting page
(http://bugreport.java.com) after checking the Bug Database (http://bugs.java.com)
for duplicates. Include error messages and the following diagnostic in your report. Thank you.
java.lang.NullPointerException
    at jdk.compiler/com.sun.tools.javac.comp.TypeEnter$MembersPhase.runPhase(TypeEnter.java:934)
    at jdk.compiler/com.sun.tools.javac.comp.TypeEnter$Phase.doCompleteEnvs(TypeEnter.java:282)
    at jdk.compiler/com.sun.tools.javac.comp.TypeEnter$MembersPhase.doCompleteEnvs(TypeEnter.java:877)
    at jdk.compiler/com.sun.tools.javac.comp.TypeEnter$Phase.completeEnvs(TypeEnter.java:251)
    at jdk.compiler/com.sun.tools.javac.comp.TypeEnter$Phase.completeEnvs(TypeEnter.java:266)
    at jdk.compiler/com.sun.tools.javac.comp.TypeEnter$Phase.completeEnvs(TypeEnter.java:266)
    at jdk.compiler/com.sun.tools.javac.comp.TypeEnter$Phase.completeEnvs(TypeEnter.java:266)
    at jdk.compiler/com.sun.tools.javac.comp.TypeEnter.complete(TypeEnter.java:198)
    at jdk.compiler/com.sun.tools.javac.code.Symbol.complete(Symbol.java:642)
    at jdk.compiler/com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:1326)
    at jdk.compiler/com.sun.tools.javac.comp.Enter.complete(Enter.java:583)
    at jdk.compiler/com.sun.tools.javac.comp.Enter.main(Enter.java:560)
    at jdk.javadoc/jdk.javadoc.internal.tool.JavadocEnter.main(JavadocEnter.java:79)
    at jdk.javadoc/jdk.javadoc.internal.tool.JavadocTool.getEnvironment(JavadocTool.java:206)
    at jdk.javadoc/jdk.javadoc.internal.tool.Start.parseAndExecute(Start.java:576)
    at jdk.javadoc/jdk.javadoc.internal.tool.Start.begin(Start.java:432)
    at jdk.javadoc/jdk.javadoc.internal.tool.Start.begin(Start.java:345)
    at jdk.javadoc/jdk.javadoc.internal.tool.Main.execute(Main.java:63)
    at jdk.javadoc/jdk.javadoc.internal.tool.Main.main(Main.java:52)
7 errors


Then I found a work around which add -bootclasspath path_to_sdk_android_jar_file in the other command-line argument text box in the JavaDoc dialog.

However, newer Java deprecated -bootclasspath. It throws another error as follows:

error: option --boot-class-path not allowed with target 11

So I used -sourcepath instead. That brought the old error (NullPointerException).

I am pretty much lost at this point.

By the way, if I choose a class with only Java elements (no-android) and create JavaDoc to that specific file only, it creates JavaDoc nicely. But this is not a good workaround for a project with a lot of classes.


Solution

  • I've faced the same issue as yours with several imports errors..

    The following solution worked for me ( I got it from mike192's answer, see the link here )

    task javadoc(type: Javadoc) {
    
        doFirst {
            configurations.implementation
                    .filter { it.name.endsWith('.aar') }
            .each { aar ->
                copy {
                    from zipTree(aar)
                    include "**/classes.jar"
                    into "$buildDir/tmp/aarsToJars/${aar.name.replace('.aar', '')}/"
                }
            }
        }
    
        configurations.implementation.setCanBeResolved(true)
        source = android.sourceSets.main.java.srcDirs
        classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
        classpath += configurations.implementation
        classpath += fileTree(dir: "$buildDir/tmp/aarsToJars/")
        destinationDir = file("${project.buildDir}/outputs/javadoc/")
        failOnError false
        exclude '**/BuildConfig.java'
        exclude '**/R.java'
    }

    All you need to do is to add the code to your build.gradle file right before your dependencies {}

    Then, double click on your Ctrl button and execute the following command :

    gradle javadoc

    The result of the javadoc can be then found in your project's directory \app\build\outputs\javadoc

    I hope this works for you