【问题标题】:java.lang.NoClassDefFoundError $$inlined$forEach$lambda$1 in Kotlinjava.lang.NoClassDefFoundError $$inlined$forEach$lambda$1 在 Kotlin
【发布时间】:2017-08-09 16:39:06
【问题描述】:

我目前正在使用 1.1.1 版的 Kotlin 开发 Android 应用程序

在我的代码中,为了读取多个MutableListMutableMap,我使用了多个forEach 结构。

不幸的是,我的应用程序因以下堆栈跟踪而崩溃:

java.lang.NoClassDefFoundError: com.package.fragment.ReminderAddFragment$onRetrieveBusinessObjects$$inlined$forEach$lambda$1 在 com.package.fragment.ReminderAddFragment.onRetrieveBusinessObjects(ReminderAddFragment.kt:275) 在 com.smartnsoft.droid4me.app.Droid4mizer.onRetrieveBusinessObjects(Droid4mizer.java:552) 在 com.smartnsoft.droid4me.app.Droid4mizer.onRetrieveBusinessObjectsInternal(Droid4mizer.java:606) 在 com.smartnsoft.droid4me.app.Droid4mizer.access$000(Droid4mizer.java:46) 在 com.smartnsoft.droid4me.app.Droid4mizer$1.run(Droid4mizer.java:197) 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423) 在 java.util.concurrent.FutureTask.run(FutureTask.java:237) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 在 java.lang.Thread.run(Thread.java:818)

这里是代码

tutorialCategories.forEach { (_, _, _, _, _, tutorials) ->
  tutorials.forEach { tutorial ->
    if (tutorial.id == simpleReminderFromExtra.tutorialId)
    {
      //...
      val mapOfreminders = mutableMapOf<Int, MutableList<Reminder>>()
      val reminders = ReminderServices.getReminderByTutorialId(simpleReminderFromExtra.tutorialId)

      reminders.forEach { reminder ->
        //...
      }

      mapOfreminders.forEach { _, finalReminders ->
        //...

        finalReminders.forEach { reminder ->
          //...
        }

        //...
      }
    }
  }
}

地点:

  • tutorialCategoriesList ;
  • tutorialsList ;
  • remindersList ;

代码的第275行是mapOfreminders.forEach { _, finalReminders -&gt;

在调试器中,我可以评估mapOfreminders 变量,一切似乎都很好。

如果有人可以帮助解决这个问题!

【问题讨论】:

  • 您能否具体说明一下,您使用的是什么版本的 Kotlin?
  • 我使用的是 Kotlin 1.1.1。我已经编辑了我的帖子。
  • 您能否发布更多上下文,例如您的包含和变量定义?你能在崩溃前以某种方式获取代码中的版本吗?如果你得到一个 no class-def 错误,你要么在分发你的二进制文件而没有所需的依赖项,要么正在使用与你构建时不同的版本运行。

标签: android lambda kotlin


【解决方案1】:

似乎并非所有手机都会出现此特定错误。我在三星 Galaxy S7 上遇到了类似的问题,应用程序因 ClassNotFoundError 而崩溃。如果我们仍想使用 lambda,此解决方案有效。 否则用 for ((key, value) in map) { ... } 替换 lambda 也可以。

【讨论】:

    【解决方案2】:

    我在 Android 6.0 和 6.0.1 上使用遇到了这个问题java.lang.NoClassDefFoundError

    Map.forEach {key ,value -> }
    

    此调用 java 8 api。

    然后,我通过在参数中添加括号解决了这个问题:

    Map.forEach {(key ,value) -> }
    

    这个调用 kotlin api

    【讨论】:

      【解决方案3】:

      几天前看了Dan Lew的post后,我建议这可能是使用Java 8中的Map.forEach { k, v -&gt; }方法引起的,该方法在Android运行时可能不可用。

      您可以尝试将另一个 forEach 与来自 Kotlin 标准库的单个条目参数一起使用:

      mapOfreminders.forEach { (_, finalReminders) -> }
      

      这里的括号用于将入口参数解构为两个变量:被忽略的键和finalReminders值。

      【讨论】:

      • 另外,您需要禁用即时运行!
      • 是否有人知道在使用 Java 8 中的 BiConsumer 函数而不是 Kotlin 函数时会引发错误或至少是警告的编译器标志?它在我的应用程序中添加了崩溃,我想确保我再也不会使用错误的版本
      • @dvkch 来自 Java 8 的 forEach 函数应该被 Android Studio 从 3.2 开始的 linter 捕获。看到这个问题issuetracker.google.com/issues/80464232
      • @ilya 它确实带有红色下划线,但不会阻止 3.2 RC3 中的编译。这是一个开始,可能必须在某处启用某些东西。感谢您的提示!
      猜你喜欢
      • 1970-01-01
      • 2019-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-11
      • 2017-03-26
      相关资源
      最近更新 更多