ava.lang.RuntimeException:无法创建类 com.example.bookkeepers.BookViewModel 的实例

Posted

技术标签:

【中文标题】ava.lang.RuntimeException:无法创建类 com.example.bookkeepers.BookViewModel 的实例【英文标题】:ava.lang.RuntimeException: Cannot create an instance of class com.example.bookkeepers.BookViewModel 【发布时间】:2019-12-29 21:37:28 【问题描述】:

我正在开发一个新书 android 应用程序,但是当我测试从 logcat 获取以下异常的代码时应用程序崩溃

java.lang.RuntimeException:无法启动活动 组件信息com.example.bookkeepers/com.example.bookkeepers.MainActivity: java.lang.RuntimeException:无法创建类的实例 com.example.bookkeepers.BookViewModel 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2843) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2921) 在 android.app.ActivityThread.-wrap11(未知来源:0) android.app.ActivityThread$H.handleMessage(ActivityThread.java:1639) 在 android.os.Handler.dispatchMessage(Handler.java:106) 在 android.os.Looper.loop(Looper.java:176) 在 android.app.ActivityThread.main(ActivityThread.java:6662) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873) 引起 作者:java.lang.RuntimeException:无法创建类的实例 com.example.bookkeepers.BookViewModel 在 androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:208) 在 androidx.l

ifecycle.ViewModelProvider.get(ViewModelProvider.java:135) 在 androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:103) 在 com.example.bookkeepers.MainActivity.onCreate(MainActivity.kt:30) 在 android.app.Activity.performCreate(Activity.java:7074) 在 android.app.Activity.performCreate(Activity.java:7065) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2796) ... 9 更多原因:java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor.newInstance0(Native Method) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:334) 在 androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:200) ... 16 更多原因:java.lang.RuntimeException:找不到 com.example.bookkeepers.BookRoomDatabase 的实现。 BookRoomDatabase_Impl 不存在于 androidx.room.Room.getGeneratedImplementation(Room.java:94) 在 androidx.room.RoomDatabase$Builder.build(RoomDatabase.java:952) 在 com.example.bookkeepers.BookRoomDatabase$Companion.getDatabase(BookRoomDatabase.kt:24) 在 com.example.bookkeepers.BookViewModel.(BookViewModel.kt:12) ... 19 更多

在扩展 AndroidViewModel 类的 BookViewModel 类下方

class BookViewModel(application: Application) : AndroidViewModel(application) 

private val bookDao: BookDao

init 
    val bookDb = BookRoomDatabase.getDatabase(application)

    bookDao = bookDb!!.bookDao()



fun insert(book: Book) 
    InsertAsyncTask(bookDao).execute(book)


companion object 
    private class InsertAsyncTask(private val bookDao: BookDao) :
        AsyncTask<Book, Void, Void>() 
        override fun doInBackground(vararg books: Book): Void? 
            bookDao.insert(books[0])
            return null
        

    

在 MainActivity.kt 下面 类

MainActivity : AppCompatActivity() 

 lateinit var bookViewModel: BookViewModel

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

    fab.setOnClickListener  view ->
        val intent =  Intent(this, NewBookActivity::class.java)
        startActivityForResult(intent, NEW_NOTE_ACTIVITY_REQUEST_CODE)
    
   bookViewModel = ViewModelProviders.of(this).get(BookViewModel::class.java)



override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) 
    super.onActivityResult(requestCode, resultCode, data)

    if (requestCode == NEW_NOTE_ACTIVITY_REQUEST_CODE && resultCode == Activity.RESULT_OK) 
        val id = UUID.randomUUID().toString()
        val authorName = data!!.getStringExtra(NewBookActivity.NEW_AUTHOR)
        val bookName = data!!.getStringExtra(NewBookActivity.NEW_BOOK)

        val book = Book(id, authorName, bookName)
        bookViewModel.insert(book)

        Toast.makeText(
            applicationContext,
            R.string.saved,
            Toast.LENGTH_LONG
        ).show()

     else 
        Toast.makeText(
            applicationContext,
            R.string.not_saved,
            Toast.LENGTH_LONG
        ).show()
    


companion object
    private const val NEW_NOTE_ACTIVITY_REQUEST_CODE = 1

低于数据库类

  @Database(entities = [Book::class], version = 1)
 abstract class BookRoomDatabase :RoomDatabase() 


abstract fun bookDao():BookDao


companion object 

    private var bookRoomInstance:BookRoomDatabase? = null
    fun getDatabase(context: Context): BookRoomDatabase? 
        if (bookRoomInstance == null)
            synchronized(BookRoomDatabase::class.java)
                if(bookRoomInstance == null)
                    bookRoomInstance = Room.databaseBuilder<BookRoomDatabase>(context.applicationContext,
                        BookRoomDatabase::class.java, "book_database")
                        .build()
                
            
    return bookRoomInstance
    


dao类以下

@Dao
 interface BookDao 
  @Insert
  fun insert(book: Book)
  

书下实体类

@Entity(tableName = "books")
class Book(@PrimaryKey val id: String,

       @ColumnInfo(name = "author")
       val author: String,
       val book:String) 

【问题讨论】:

我从未使用过 Room,但我注意到您正在尝试实例化一个 Abstract 类,我认为这是不可能的。您应该有一个实现抽象函数的BookRoomDatabase 的子类。我认为这就是您看到崩溃的原因,因为它无法创建抽象类的实例。 你能发布你的 Arch 组件的 Gradle 依赖吗? @jsmyth886 abstract 关键字不是问题,而是 Room 数据库的要求。查看文档:developer.android.com/training/data-storage/room 【参考方案1】:

您使用 kotlin 并在您的应用程序 build.gradle 中使用 kapt 插件 apply plugin 'kotlin-kapt' 并使用 kapt 而不是 annotationProcessor 的想法是

implementation "android.arch.lifecycle:extensions:$lifecycle_version"
kapt "android.arch.lifecycle:compiler:$lifecycle_version"

implementation "android.arch.persistence.room:runtime:$room_version"
kapt "android.arch.persistence.room:compiler:$room_version"

查看这个答案https://***.com/a/50487165/4614550

【讨论】:

【参考方案2】:

问题是您试图在没有提供所需参数application: Application 的情况下实例化 ViewModel。 我在这里发布了解决此问题的答案:https://***.com/a/65004171/13834895。

【讨论】:

以上是关于ava.lang.RuntimeException:无法创建类 com.example.bookkeepers.BookViewModel 的实例的主要内容,如果未能解决你的问题,请参考以下文章