android.content.Context.getApplicationContext()' 在空对象引用上

android.content.Context.getApplicationContext()' on a null object reference

我有这个任务数据库

@Database(
        entities = [
            Todo::class
        ],
        version = 1
)
abstract class TaskDataBase : RoomDatabase() {

    abstract val taskDao: TaskDao

    companion object {
        @Volatile
        private var INSTANCE: TaskDataBase? = null

        fun getInstance(context: Context): TaskDataBase {
            synchronized(this){
                return INSTANCE ?: Room.databaseBuilder(
                        context.applicationContext,
                        TaskDataBase::class.java,
                        "task_db"
                ).build().also {
                    INSTANCE = it
                }
            }
        }
    }
}

而mainActivity是这样的

class MainActivity : AppCompatActivity(), TodoAdapter.OnItemLongClickListener {
    private var todoList = mutableListOf(
            Todo("First Todo item", false),
            Todo("Second Todo item", true),
            Todo("Third Todo item", false),
            Todo("Forth Todo item", true),
            Todo("Fifth Todo item", false),
            Todo("Sixth Todo item", true),
            Todo("Seventh Todo item", false)
    )
    private val adapter = TodoAdapter(todoList, this)
    private val dao:TaskDao = TaskDataBase.getInstance(this).taskDao
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        rvTodos.adapter = adapter
        rvTodos.layoutManager = LinearLayoutManager(this)

当我 运行 应用程序时出现此错误

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference

它告诉我上下文中有错误。 我不知道该怎么办。我尝试过改变,但效果不佳。

您在上下文存在之前将上下文传递给属性。

您可以在 onCreate 完成后分配上下文。

您可以声明这些属性。然后就可以设置setContentView.

后面的值了
private var dao:TaskDao;

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        dao = TaskDataBase.getInstance(this).taskDao
}