webentwicklung-frage-antwort-db.com.de

Fehler beim Gradle Build: Konnte die äußere Klasse nicht finden

Wenn ich versuche zu bauen, bekomme ich diesen Stacktrace: 

Exception in thread "main" Java.lang.NullPointerException: Couldn't find outer class com/xxx/CheckListPresenter$onAttached$1$5 of com/xxx/CheckListPresenter$onAttached$1$5$1
    at com.google.common.base.Preconditions.checkNotNull(Preconditions.Java:1079)
    at com.google.devtools.build.Android.desugar.ClassVsInterface.isOuterInterface(ClassVsInterface.Java:56)
    at com.google.devtools.build.Android.desugar.InterfaceDesugaring.visitOuterClass(InterfaceDesugaring.Java:246)
    at org.objectweb.asm.ClassReader.accept(ClassReader.Java:638)
    at org.objectweb.asm.ClassReader.accept(ClassReader.Java:500)
    at com.google.devtools.build.Android.desugar.Desugar.desugarClassesInInput(Desugar.Java:477)
    at com.google.devtools.build.Android.desugar.Desugar.desugarOneInput(Desugar.Java:361)
    at com.google.devtools.build.Android.desugar.Desugar.desugar(Desugar.Java:314)
    at com.google.devtools.build.Android.desugar.Desugar.main(Desugar.Java:711)

Ich habe die CheckListPresenter-Klasse überprüft und scheint keine Probleme zu haben. Ich habe versucht, die Klasse zu löschen, nur um zu sehen, ob sie erstellt werden würde, aber der Fehler wurde in einer anderen Klasse fortgesetzt, die dasselbe Problem angibt. 

Das letzte Mal, als ich diesen Code berührt habe, war vor einigen Monaten, daher bin ich mir nicht sicher, was die Änderung ausgelöst hat.

Dinge, die wichtig sein können: Dies ist ein Android-Projekt. Dies ist in Kotlin geschrieben. Dies schlägt bei der Gradle-Task transformClassesWithDesugarForDebug fehl


Bearbeitungen

Das sind alles nur Stiche im Dunkeln, die ich versucht habe:

  • Ein neues Projekt erstellen und nur meinen Quellcode und meine Gradle-Dateien einziehen.

  • Löschen von Java 8 auf 7. 

  • Andere Version von JDK. Ich habe 1.8.0_151 und 1.8.0_152 ausprobiert. 

  • javaMaxHeapSize "4g" zu build.gradle hinzufügen.

  • Alles aufrüsten: gradle Wrapper und jede Abhängigkeit. 

  • Dolch zugunsten von Koin entfernt

  • Kapt entfernt

  • Verwendet sowohl die Preview- als auch die Stable-Version von Android Studio

Hier ist mein Build-Scan für was es gut ist

Neue Entdeckung:

Dies ist der Codeausschnitt, der mich umbringt:

view?.let { v ->
    v.getCancelClicks()
        .doOnSubscribe({ disposables.add(it) })
        .subscribe({
           v.showExitDialog()
              .filter { it }
              .subscribe({
                 cancel()
            }, this::onError)

         }, this::onError)
    }

Was seltsam ist, ist keiner von diesen allein wird mir Probleme geben

view?.let { v ->
    v.getCancelClicks()
        .doOnSubscribe({ disposables.add(it) })
        .subscribe({
            //removed 
         }, this::onError)
    }
}

oder 

view?.let { v ->
    v.showExitDialog()
        .filter { it }
        .subscribe({
           cancel()
        }, this::onError)
 }

Aber zusammen sind sie ein Problem. 

Etwas anderes ist view, das in der Basisklasse definiert ist und generisch ist. 

Derzeit ist es meine Aufgabe, view?.let{ zu entfernen und einfach view!! zu verwenden. Dies ist offensichtlich ein Fehler, aber ich bin nicht sicher, wem er dies melden soll. Gradle, Kotlin, JetBrains, Gott? 

12
Chad Bingham

Das Problem wurde durch das Hinzufügen von Android.enableD8.desugaring = true zu gradle.properties behoben.

7
Adrian Blanco

Das Problem ist hier unter https://issuetracker.google.com/issues/72750890 ..__ abgelegt. Beide dort genannten Lösungen funktionierten für mich: Hinzufügen von classpath 'com.Android.tools.build:gradle:3.0.1' zu build.gradle oder Hinzufügen von Android.enableD8.desugaring=true zu gradle.properties

1
yunik

Ich habe eine Möglichkeit, diesen Fehler zu umgehen: Java.lang.NullPointerException: Couldn't find outer class com/iconfitness/iconaudit/common/fragments/SettingsFragment$onCreate$1$1 of com/iconfitness/iconaudit/common/fragments/SettingsFragment$onCreate$1$1$1.

Verschieben Sie einfach diesen Blockcode 

v.showExitDialog()
              .filter { it }
              .subscribe({
                 cancel()

oo andere Methode. Ich begegne diesem Problem nicht mehr. Ich hoffe, dies wird dir helfen.

1
beokh

Als Problemumgehung können Sie let durch eine Nullprüfung ersetzen. Zumindest der Code wurde danach kompiliert

if (view!=null)
    view.showExitDialog()
        .filter { it }
        .subscribe({
           cancel()
        }, this::onError)
}