【问题标题】:Possible reason for "Error:cannot generate view binders java.lang.NullPointerException"“错误:无法生成视图活页夹 java.lang.NullPointerException”的可能原因
【发布时间】:2017-06-22 03:39:01
【问题描述】:

我将 Android Studio 用于我的 Android 项目。当构建崩溃并出现奇怪的堆栈跟踪时,我遇到了一个问题,如下所示:

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)

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

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

【问题讨论】:

  • 我正在处理同样的问题。就我而言,我认为这是因为有一个内部类,但我不确定。我做了几处更改,但完全不知道日志中发生了什么

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


【解决方案1】:

在我的例子中,我在包之间重命名和移动类时依赖于 Android Studio。但它没有对布局的 XML 进行更正,其中对 datavariable 元素的 type 属性中重构类的引用进行了更正。

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

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

【讨论】:

  • 这个。为此,我浪费了将近一个小时。我希望 Android Studio 能够显示数据绑定问题的实际错误。
  • 有什么办法可以修改编译器错误来告诉你这是什么文件?还是猜测很多?
  • @AdamMc331 不幸的是,我没有尝试这样做。打开布局文件很容易看到 lint 标记了错误的标记
  • 相同。非常感谢
【解决方案2】:

对我来说,这在将 Android Studio 更新到 3.5.2 版后开始发生

为了解决这个问题,我降级了Android Gradle Plugin

buildscript {

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

【讨论】:

    【解决方案3】:

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

    我的代码类似于:

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

    我遇到了同样的错误。

    原来类 A 没有被导入到顶部。添加<import type="com.company.A"> 标签解决了这个问题。

    附注android:visible 是我拥有的自定义绑定适配器。

    【讨论】:

      【解决方案4】:

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

      请记住,如果您使用数据绑定方法,则必须返回正确的值,否则它引发的错误将毫无帮助。

      【讨论】:

      • 该死,我花了整整一个晚上才试图将我移动的课程和包恢复到错误之前的位置......然后繁荣,我看到了这个 n 纠正了我的代码 n 中提琴!成功了
      【解决方案5】:

      如果这个问题仍然相关。对我来说,我认为在我的 xml 布局文件中,我包含了一个类(不是一个类的实例)作为变量,即我有这个代码

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

      应该是这样的

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

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

      【讨论】:

        【解决方案6】:

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

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

        就我而言,我更新了明显的内容,但我仍然遗漏了一些东西。因此,我所做的是进入我的开发分支(不是 Android X),运行构建,然后深入构建文件夹以查看生成代码的所有库。一旦我这样做了,我就能够一一查看嫌疑人,直到找到导致此问题的依赖项。您可以更新它,或者在我的情况下将其删除,并且此错误已解决。 :)

        【讨论】:

        • 这对我来说也是一样的,在找到生成的代码/构建的内容后仍然缓存支持库。通过运行cleaninvalidate+restart、删除.gradle缓存和构建目录解决了我的问题,如果我们不想为特定的库升级到AndroidX,也可以提供jetifier.blacklistcheck here
        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          将 Android Gradle 插件降级到 3.5.1 为我解决了这个问题

          【讨论】:

          • 您好,您可以添加更具体的答案,例如如何降级或链接到为什么会在 3.5.2 上发生这种情况,谢谢您的参与。
          【解决方案9】:

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

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

          【讨论】:

            【解决方案10】:

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

            显然与 atlascoder 发布的问题不同,但我无论如何都提到,也许有人在这篇文章中遇到与我相同的问题。

            【讨论】:

              【解决方案11】:

              正如@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

              【讨论】:

                【解决方案12】:

                在我的例子中,我在 XML 文件中写错了我的视图模型变量的名称。我把它命名为 VProgressBar 而不是 vProgressBar:

                android:visibility="@{fatherViewModel.vProgressBar}"
                

                【讨论】:

                  猜你喜欢
                  • 2018-03-23
                  • 1970-01-01
                  • 2018-03-23
                  • 2013-10-14
                  • 2014-10-12
                  • 2023-04-03
                  • 2017-06-19
                  • 2013-03-20
                  • 2012-12-27
                  相关资源
                  最近更新 更多