2

我有以下代码:

abstract class Database : RoomDatabase() {

    companion object {
        @Volatile
        lateinit var INSTANCE: Database
            private set

        fun init(context: Context) {
            val initialized = ::INSTANCE.isInitialized
            if (!initialized) {
                INSTANCE = Room.databaseBuilder(...

由于某种原因,它编译得很好。在运行时,当应用程序在设备上启动时,会引发此异常:

java.lang.NoSuchFieldError:没有 Lpersistance/Database 类型的静态字段 INSTANCE;在 Lpersistance/Database$Companion 类中;或其超类('persistance.Database$Companion' 的声明出现在 /data/app/split_lib_slice_1_apk.apk 中)在persistance.Database$Companion.init(Database.kt:22)

检查类的反编译版本,我发现INSTANCE在 Database 类中定义的变量:

public abstract class Database extends RoomDatabase {
   private static volatile Database INSTANCE;

.IsInitialised代码实际上以这种方式在 Java 版本中表示:

public static final class Companion {
   public final Database getINSTANCE() {
      return Database.access$getINSTANCE$cp();
   }
   private final void setINSTANCE(Database var1) {
      Database.INSTANCE = var1;
   }

   public final void init(Context context) {
      boolean initialized = INSTANCE != null;  // error here
      if (!initialized) { ...

很明显,问题是INSTANCE必须将变量引用为Database.INSTANCE.

无法理解,为什么代码编译但抛出运行时异常以及如何检查lateinit变量是否已初始化?

4

0 回答 0