当前位置: 首页 > 知识库问答 >
问题:

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

邹普松
2023-03-14

我正在html" target="_blank">开发一本新书android应用程序,但当我测试从logcat获取以下异常的代码时,应用程序崩溃

hread.mainRuntimeException:无法启动活动ComponentInfo{hread.java:6662}:java.lang.reflect.RuntimeException:无法创建ethod.invokeBookViewModel类的实例com.android.internal.os.ActivityTaller.runLaunchActive(ActivityTnit.java:547)com.android.internal.os.ActivityTnit.mainLaunchActive(ActivityTnit.java:873)java.lang.ActivityThread.-wrap11(未知来源:0)在com.example.bookkeepers.ActivityThread$H. handleMessage(ActivityTandroidx.lifecycle.)在android.os.Handler.dispatchMessage(Handler.java:106)在android.os.Looper.loop(Looper.java:176)android.app.ActivityTjava.lang.(ActivityTcom.example.bookkeepers/com.example.bookkeepers.MainActivity)java.lang.Mcom.example.bookkeepers.(Native Method)android.app.RuntimeInit$Method odAndArgsChread.perform(RuntimeIhread.java:2843)在android.app.ZygoteIhread.handle(ZygoteIhread.java:2921)引起的:android.app.RuntimeException:无法在hread.java:1639ViewModelProvider$AndroidViewModelFacory. create(ViewModelProvider. java: 208)在androidx. l创建android.app.BookViewModel类的实例

ifecycle。ViewModelProvider。在androidx上获取(ViewModelProvider.java:135)。生命周期。ViewModelProvider。获取(ViewModelProvider.java:103)。实例簿记员。主要活动。在android上创建(MainActivity.kt:30)。应用程序。活动在android上执行创建(Activity.java:7074)。应用程序。活动在android上执行创建(Activity.java:7065)。应用程序。仪器仪表。android上的callActivityOnCreate(Instrumentation.java:1214)。应用程序。ActivityThread。performLaunchActivity(ActivityThread.java:2796)。。。9更多原因:java。lang.reflect。java上的InvocationTargetException。lang.reflect。构造函数。java上的newInstance0(本机方法)。lang.reflect。构造函数。androidx上的newInstance(Constructor.java:334)。生命周期。ViewModelProvider$AndroidViewModelFactory。创建(ViewModelProvider.java:200)。。。还有16个原因:java。lang.RuntimeException:找不到com的实现。实例簿记员。BookRoomDatabase。androidx上不存在BookRoomDatabase\u Impl。房间房间androidx上的GetGenerateImplementation(Room.java:94)。房间RoomDatabase$生成器。在com上构建(RoomDatabase.java:952)。实例簿记员。BookRoomDatabase$Companion。getDatabase(BookRoomDatabase.kt:24)位于com。实例簿记员。BookViewModel。(BookViewModel.kt:12)。。。19个以上

下面是我的BookViewModel类,它扩展了AndroidViewModel类

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
        }

    }
}}

主活动下方。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) {
}

共有2个答案

双志强
2023-03-14

问题是您试图在不提供所需参数的情况下实例化ViewModel应用程序:应用程序。我在这里发布了一个解决这个问题的答案:https://stackoverflow.com/a/65004171/13834895.

俞衡虑
2023-03-14

它背后的想法是,您正在使用kotlin,并且在您的应用程序build.gradle中,您应该应用kapt plugin应用插件'kotlin-kapt'并使用kapt而不是annotationProcess

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://stackoverflow.com/a/50487165/4614550

 类似资料:
  • 这是我的代码 这是从谷歌样本..后我想: 问题就在这里: java.lang.RuntimeException:无法创建类com.lacas.db.room.BookMarkViewModel的实例 我可以用这个片段吗? null

  • 你好,我是android中MVVM的新手,正在使用livedata。我正在尝试创建viewmodel的一个实例。我觉得问题在于我没有将存储库传递给viewmodel构造函数。我一直无法创建viewmodel的实例。我不知道该怎么做这里是我的viewmodel和它的创建。

  • 我尝试了MVVM架构,实现了所有需要的类和方法。在MainActivity中创建ViewModel类的对象时,我得到以下错误的实例。 我试了一个YouTube教程中的例子。我把所有的实现都做对了。我尝试过将ViewModel类和构造函数公开,但应用程序仍然在运行时崩溃。 mainactivity.java NoteViewModel.java noteRepository.java 日志

  • 问题内容: 我希望能够通过在已实例化的对象上调用方法来创建对象的新实例。例如,我有一个对象: 我希望能够调用并拥有两个有机体类型的对象。此时我的方法如下所示: 并且我非常确定它不起作用(我甚至不确定如何测试它。我在本文中尝试了gc方法)。那么,如何使我的对象创建自己的副本,就像我创建的第一个对象(带有)一样,该副本是可访问的? 问题答案: 另一个选项-如果方法中未使用实例(): 这样可以确保生物产

  • 我在我的词典应用程序中使用了第一个刀柄,但是当我运行我的应用程序时,它会崩溃并显示此日志: 这是我的模块类:`@ Module @ InstallIn(singleton component::class)object word info Module { 这是我的主活动类,它初始化视图模型并尝试使用它: 这是我的观点模型: 问题出在哪里,怎么解决?