web-dev-qa-db-fra.com

Gradle Build Failure: impossible de trouver la classe externe

En essayant de construire, j'obtiens ce 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)

J'ai vérifié la classe CheckListPresenter et il ne semble pas y avoir de problèmes. J'ai essayé de supprimer la classe juste pour voir si elle se construirait, mais l'erreur vient de passer à une autre classe énonçant le même problème. 

La dernière fois que j'ai abordé ce code, c'était il y a quelques mois, je ne suis donc pas sûr de ce qui a déclenché le changement.

Choses qui peuvent compter: Ceci est un projet Android. Ceci est écrit en Kotlin. Cela échoue dans la tâche transformClassesWithDesugarForDebug gradle


Édite

Ce ne sont que des coups de poignard dans le noir que j'ai essayé:

  • Créer un nouveau projet et ne déplacer que mon code source et mes fichiers de classement.

  • Passer de Java 8 à 7. 

  • Version différente de JDK. J'ai essayé 1.8.0_151 et 1.8.0_152. 

  • Ajout de javaMaxHeapSize "4g" à build.gradle.

  • Tout mettre à niveau: gradle wrapper et chaque dépendance. 

  • Supprimé Dague en faveur de Koin

  • Kapt supprimé

  • Utilisé à la fois les versions Preview et Stable d'Android Studio

Voici mon build scan à quoi bon ça va faire

Nouvelle découverte:

C'est l'extrait de code qui me tue:

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

         }, this::onError)
    }

Ce qui est étrange, est que ni l'un ni l'autre seul ne me posera de problèmes

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

ou 

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

Mais ensemble ils sont un problème. 

Une autre chose à noter, view, est définie dans la classe de base et est un générique. 

Actuellement, mon travail consiste à supprimer view?.let{ et à utiliser simplement view!!. C’est évidemment un bug, mais je ne sais pas à qui le signaler. Gradle, Kotlin, JetBrains, Dieu? 

12
Chad Bingham

Le problème s'est résolu quand j'ai ajouté Android.enableD8.desugaring = true à gradle.properties

7
Adrian Blanco

J'ai un moyen de contourner cette erreur: 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.

Il suffit de déplacer ce code 

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

oo autre méthode. Je ne rencontre plus ce problème. J'espère que cela t'aidera.

1
beokh

En guise de solution de contournement, vous pouvez remplacer let par une vérification nulle. Au moins le code a commencé à compiler après cela

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