我有以下代码:
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:没有类型的静态字段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
变量是否已初始化?