web-dev-qa-db-fra.com

Raison possible de "Erreur: impossible de générer des classeurs de vue Java.lang.NullPointerException"

J'utilise Android Studio pour mes Android projets. J'ai rencontré un problème lorsque les builds se bloquent avec une étrange trace de pile, comme ceci:

Error:Execution failed for task ':app:compileDevDebugJavaWithJavac'.
 Java.lang.RuntimeException: failure, see logs for details.
  cannot generate view binders Java.lang.NullPointerException
    at Android.databinding.tool.reflection.ModelMethod.isBoxingConversion(ModelMethod.Java:155)
    at Android.databinding.tool.store.SetterStore.isBetterParameter(SetterStore.Java:946)
    at Android.databinding.tool.store.SetterStore.getBestSetter(SetterStore.Java:838)

et il a semblé que la liaison de données a été rompue dans son ensemble.

J'ai fait du refactoring avant et déplacé les classes entre les packages.

21
atlascoder

Dans mon cas, je me suis appuyé sur Android Studio pour renommer et déplacer des classes entre les packages. Mais il n'a pas procédé à la correction des XML des dispositions où se trouvaient des références sur les classes refactorisées dans le type attribut de l'élément variable dans data.

Donc, la valeur de mon type précédent pointait vers des fichiers non existants et la construction s'est bloquée.

C'est une simple erreur mais cela peut prendre plus de temps pour trouver la source. J'espère que cela aiderait quelqu'un.

26
atlascoder

Assurez-vous d'importer toutes les classes référencées dans les liaisons xml

J'avais du code quelque chose comme:

Android:visible="@{obj instanceof A}"

J'obtenais cette même erreur.

Il s'avère que la classe A n'a pas été importée en haut. Ajouter <import type="com.company.A"> tag a résolu le problème.

P.S. Android: visible est un adaptateur de liaison personnalisé que j'ai.

6
Daniel Shatz

dans mon cas, mon problème était dans un LongClickListener que la méthode pour cet écouteur doit avoir renvoyé un boolean mais ma méthode a renvoyé void donc quand j'ai ajouté la bonne déclaration de retour, cela a fonctionné ça va.

gardez à l'esprit que si vous utilisez une méthode de liaison de données, vous devez renvoyer la valeur correcte, sinon l'erreur qu'elle génère n'est pas du tout utile.

2
pouya

Vous êtes peut-être tombé sur cette question après avoir migré vers Android X. Si tel est le cas, et que vous êtes certain que vos fichiers XML sont corrects, mais cela ne fonctionne toujours pas, vous devriez commencer à regarder les bibliothèques qui génèrent du code.

Les bibliothèques qui génèrent du code ne peuvent pas être facilement converties par le Jettifyer. Quelques informations ici - https://blog.danlew.net/2018/11/14/the-reality-of-migrating-to-androidx/

Dans mon cas, j'ai mis à jour les plus évidents, mais il me manquait encore quelque chose. Donc, ce que j'ai fait, c'est aller dans ma branche de développement (ce n'était pas Android X), j'ai exécuté une build et creusé dans le dossier de build pour voir toutes les bibliothèques qui ont généré du code. J'ai fait cela, j'ai pu examiner les suspects un par un jusqu'à ce que je trouve la dépendance à l'origine de ce problème. Vous pouvez soit le mettre à jour, soit, dans mon cas, le supprimer et cette erreur a été résolue. :)

1
AdamMc331

La fonction getter pour toute instance que vous référez à partir de votre fichier xml peut ne pas avoir été définie ou la fonction getter peut ne pas avoir public spécificateur d'accès.

1
senthil kumar

Je suis confronté à ce problème lorsque je définis une variable comme celle-ci (Android Studio ne prévient rien)

<data>
    <variable
        name="onGlobalLayoutA"
        type="ViewTreeObserver.OnGlobalLayoutListener"/>

    <import type="Android.view.ViewTreeObserver"/>
</data>

Et je résoudre par

<data>
    <variable
        name="onGlobalLayoutA"
        type="Android.view.ViewTreeObserver.OnGlobalLayoutListener"/>
</data>

J'espère que cela aiderait quelqu'un.

0
Phan Van Linh

Dans mon cas, la raison était que j'ai utilisé un type pour une variable qui est un autre module et que ce module est ajouté en tant que "implémentation" dans le script de construction. Le passage à "api" a résolu le problème.

Clairement pas le même problème que celui publié par atlascoder mais je le mentionne malgré tout, peut-être que quelqu'un a gits cet article avec le même problème que moi.

0
zsolt világos

Rétrograder Android Gradle Plugin to 3.5.1 a résolu le problème pour moi

0

Comme @ hiddeneyes02 l'a mentionné, cela a commencé à se produire lors de la mise à niveau de Android Gradle Plugin de 3.5.1 à 3.5.2, cela semble être le bogue: https://issuetracker.google .com/issues/143778134

Lorsque j'ai construit le projet avec l'outil de commande, j'ai eu les mêmes erreurs que dans cet article: lors de la construction Android projet avec Android Gradle Plugin v 3.5.2 mes builds échouent

0
kotlinski