Возможная причина для "Ошибка: невозможно создать привязки вида java.lang.NullPointerException"

Я использую Android Studio для своих проектов Android. Я столкнулся с проблемой при сбое сборки с помощью странной stacktrace, например:

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)

и казалось, что привязка данных сломалась целиком.

Я делал рефакторинг раньше и перемещал классы между пакетами.

Ответ 1

В моем случае я полагался на Android Studio при переименовании и перемещении классов между пакетами. Но это не привело к исправлению для XML-макетов макетов, где были ссылки на рефакторированные классы в атрибуте type элемента variable в data.

Таким образом, мое предыдущее значение типа указывало на не существующие файлы и сбой сборки.

Это простая ошибка, но для поиска источника может потребоваться больше времени. Надеюсь, это поможет кому-то.

Ответ 2

Убедитесь, что вы импортируете все классы, на которые вы ссылаетесь, в привязках xml

У меня был код что-то вроде:

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

Я получал ту же ошибку.

Оказывается, что класс A не был импортирован сверху. Добавление <import type="com.company.A"> решило проблему.

PS android: visible - это специальный адаптер привязки у меня.

Ответ 3

Функция getter для любого экземпляра, который вы ссылаетесь на ваш xml файл, возможно, не была определена, или функция getter может не иметь спецификатора общего доступа.

Ответ 4

Возможно, вы столкнулись с этим вопросом после перехода на Android X. Если это так, и вы уверены, что ваши XML файлы в порядке, но он все еще не работает, вам следует начать поиск библиотек, которые генерируют код.

Библиотеки, которые генерируют код, не могут быть легко преобразованы Jettifyer. Некоторая информация здесь - https://blog.danlew.net/2018/11/14/the-reality-of-migrating-to-androidx/

В моем случае я обновил очевидные, но я все еще что-то упустил. Итак, я пошел в свою ветку разработки (это был не Android X), запустил сборку и закопался в папку сборки, чтобы увидеть все библиотеки, которые генерировали код. После того, как я это сделал, я смог посмотреть на подозреваемых по одному, пока не обнаружил зависимость, которая вызывала эту проблему. Вы можете либо обновить его, либо, в моем случае, удалить его, и эта ошибка была устранена. :)

Ответ 5

Я сталкиваюсь с этой проблемой, когда я определяю переменную вроде этого (Android Studio ничего не предупреждает)

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

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

И я решаю это

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

Надеюсь, это поможет кому-то.

Ответ 6

В моем случае причина заключалась в том, что я использовал тип для переменной, которая является другим модулем, и этот модуль добавляется как "реализация" в скрипт сборки. Переход на "api" разрешил проблему.

Очевидно, не та же проблема, что и сообщение, отправленное atlascoder, но я упоминаю независимо, может быть, кто-то gits этой статьи с той же проблемой, что и я.

Ответ 7

в моем случае моя проблема заключалась в LongClickListener что метод для этого слушателя должен был вернуть boolean но мой метод возвратил void поэтому, когда я добавил правильный оператор return, он работал просто отлично.

имейте в виду, что если вы используете метод привязки данных, вы должны вернуть правильное значение, иначе выдается ошибка, которая вообще не помогает.

Ответ 8

вероятно, ваш $ JAVA_HOME не установлен. Проверь это