我有以下代码:
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
变量是否已初始化?