web-dev-qa-db-ja.com

Kotlinのjava.lang.NoClassDefFoundError $$ inlined $ forEach $ lambda $ 1

現在、Androidアプリケーションにバージョン1.1.1のKotlinを使用しています。

私のコードでは、いくつかのforEachMutableListを読み取るために、いくつかのMutableMap構造体を埋め込んでいます。

残念ながら、私のアプリは次のスタックトレースでクラッシュします:

Java.lang.NoClassDefFoundError:com.package.fragment.ReminderAddFragment $ onRetrieveBusinessObjects $$ inlined $ forEach $ lambda $ 1 at com.package.fragment.ReminderAddFragment.onRetrieveBusinessObjects(ReminderAddFragment.kt:275)at com.smartnsoft.Droid4mapp.app .onRetrieveBusinessObjects(Droid4mizer.Java:552)at com.smartnsoft.droid4me.app.Droid4mizer.onRetrieveBusinessObjectsInternal(Droid4mizer.Java:606)at com.smartnsoft.droid4me.app.Droid4mizer.access $ 000(Droid4mizer.Java:46)at Java.util.concurrent.FutureTask.run(FutureTask。 Java:237)at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1113)at Java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.Java:588)at 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変数を評価でき、すべてが問題ないようです。

誰かがこの問題の解決を手伝ってくれるなら!

34
rolandl

Dan Lewの post を数日前読んだ後、これはJava 8からのMap.forEach { k, v -> }メソッドを使用することによって引き起こされる可能性があることを示唆します。 Androidランタイムでは使用できない場合があります。

Kotlin標準ライブラリからの単一のエントリパラメータを使用して、別の forEach を使用することもできます。

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

ここでは、かっこを使用して、エントリパラメータを2つの変数に分解しています:無視されたキーとfinalReminders値。

73
Ilya

この問題が発生しましたJava.lang.NoClassDefFoundError on Android 6.0および6.0.1を使用して

Map.forEach {key ,value -> }

この呼び出しJava 8 api。

そして、パラメータに角かっこを追加することでこの問題を解決しました:

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

これはkotlin apiを呼び出します

12
zhangliang

この特定のエラーはすべての電話で発生するわけではないようです。 Samsung Galaxy S7でも同様の問題に直面しましたが、ClassNotFoundErrorでアプリがクラッシュしました。このソリューションは、ラムダを引き続き使用する場合に機能します。または、ラムダをfor ((key, value) in map) { ... }に置き換えることもできます。

1
theThapa