可能的原因"错误:无法生成视图绑定器java.lang.NullPointerException"

时间:2017-02-04 23:12:58

标签: java android data-binding nullpointerexception android-databinding

我在Android项目中使用Android Studio。当构建与奇怪的堆栈跟踪崩溃时,我遇到了一个问题,如下所示:

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)

似乎数据绑定整体被破坏了。

之前我进行了重构,并在包之间移动了类。

11 个答案:

答案 0 :(得分:25)

就我而言,在重命名和在包之间移动类时,我依赖Android Studio。但是它没有对布局的XML进行修正,其中typevariable元素的data属性中的重构类的引用。

所以我之前的类型值指向不存在的文件并构建崩溃。

这是一个简单的错误,但可能需要更多时间才能找到来源。希望这会对某人有所帮助。

答案 1 :(得分:6)

对我来说,这是在将Android Studio更新到版本3.5.2之后开始的事情

要解决此问题,我将Android Gradle Plugin降级了

buildscript {

    repositories {
        //..........
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.1'
        //......
    }
}

答案 2 :(得分:4)

确保您导入在XML绑定中引用的所有类

我有类似的代码:

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

我遇到了同样的错误。

结果证明,类A并不是最上面的。添加<import type="com.company.A">标签可以解决此问题。

P.S。 android:visible是我拥有的自定义绑定适配器。

答案 3 :(得分:1)

您从xml文件引用的任何实例的 getter函数 可能尚未定义,或者getter函数可能没有 public < / em> 访问说明符。

答案 4 :(得分:1)

在迁移到Android X后,您可能已经偶然发现了这个问题。如果是这种情况,并且您肯定XML文件可以,但是仍然无法正常工作,则应该开始查看生成代码的库。

Jettifyer无法轻松转换生成代码的库。这里的一些信息-https://blog.danlew.net/2018/11/14/the-reality-of-migrating-to-androidx/

就我而言,我更新了明显的内容,但仍然缺少某些内容。因此,我要做的是进入我的开发分支(不是Android X),运行一个构建,然后挖入build文件夹以查看所有生成代码的库。一旦这样做,我就可以逐个查看可疑对象,直到找到导致此问题的依赖项。您可以更新它,或者就我而言,将其删除,此错误已得到解决。 :)

答案 5 :(得分:1)

将Android Gradle插件降级为3.5.1为我解决了该问题

答案 6 :(得分:0)

当我定义这样的变量时,我遇到了这个问题(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>

希望这会对某人有所帮助。

答案 7 :(得分:0)

在我的情况下,原因是我为变量使用了一个类型,该变量是另一个模块,并且该模块在构建脚本中作为“实现”添加。更改为“ api”即可解决该问题。

与atlascoder发布的问题显然不一样,但是我提到不管,也许有人将这篇文章与我遇到的问题混在一起。

答案 8 :(得分:0)

在我的情况下,我的问题是在LongClickListener中,此侦听器的方法必须返回了boolean,但是我的方法返回了void,所以当我添加正确的return语句时,它可以工作很好。

请记住,如果使用数据绑定方法,则必须返回正确的值,否则抛出的错误根本没有帮助。

答案 9 :(得分:0)

正如@ hiddeneyes02所述,这是从Android Gradle插件从3.5.1升级到3.5.2时开始发生的,这似乎是一个错误: https://issuetracker.google.com/issues/143778134

当我使用命令工具构建项目时,出现了与本文相同的错误: When building Android project with Android Gradle Plugin v. 3.5.2 my builds fail

答案 10 :(得分:0)

如果此问题仍然有意义。对我来说,我发现在我的xml布局文件中,我将一个类(而不是一个实例)作为变量包括在内,即我拥有此代码

<variable
      name="Converters"
      type="com.example.flexapp.utils.Converters" />

它应该是

<import type="com.example.flexapp.utils.Converters"/>

因为这是一个类,而不是对象。