java.lang.NoClassDefFoundError $$在Kotlin中内联$ forEach $ lambda $ 1

时间:2017-03-18 00:30:15

标签: android lambda kotlin

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

在我的代码中,我有几个forEach结构的叠加,以便阅读多个MutableListMutableMap

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

  

java.lang.NoClassDefFoundError:   com.package.fragment.ReminderAddFragment $ onRetrieveBusinessObjects $$内嵌$ $的forEach拉姆达$ 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)at   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 ->

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

如果有人可以帮忙解决此问题!

3 个答案:

答案 0 :(得分:73)

几天前读完Dan Lew的post之后,我会建议使用Java 8中的BigDecimal方法,这可能在Android运行时无法使用。

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

String

此处括号用于将输入参数解构为两个变量:忽略键和Map.forEach { k, v -> }值。

答案 1 :(得分:11)

我在Android 6.0和6.0.1上通过使用

遇到了这个问题java.lang.NoClassDefFoundError
Map.forEach {key ,value -> }

此调用Java 8 API。

然后,我通过在参数中添加方括号来解决此问题:

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

此调用kotlin api

答案 2 :(得分:1)

似乎在所有手机上都没有发生这种特殊错误。我遇到了与三星Galaxy S7类似的问题,其中应用程序崩溃了ClassNotFoundError。如果我们仍然想要使用lambda,这个解决方案是有效的。 否则用for ((key, value) in map) { ... }替换lambda也有效。