Не удается создать экземпляр класса ViewModel

#java #android-studio #exception #android-room

Вопрос:

Здравствуйте, я создаю приложение для фотоальбома, используя базу данных комнат. Но когда я запускаю приложение, я получил сообщение об ошибке, в котором говорится, что не удается создать экземпляр класса viewmodel. Ваша помощь будет высоко оценена. вот логкат

исключение java.lang.RuntimeException: Не удается запустить компонент активности{com.пример.фотоальбом/com.пример.фотоальбом.MainActivity}: исключение java.lang.RuntimeException: Не удается создать экземпляр класса com.пример.фотоальбом.Myimagesviewмодель в android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449) в android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) в android.app.servertransaction.LaunchActivityItem.выполнить(LaunchActivityItem.java:85) в android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) на Android.приложение.серверная транзакция.TransactionExecutor.выполнить(TransactionExecutor.java:95) в android.app.ActivityThread$H. handleMessage(ActivityThread.java:2066) в android.os.Обработчик.Диспетчер сообщений(Обработчик.java:106) в android.os.Петлитель.цикл(петлитель.java:223) в android.app.ActivityThread.main(ActivityThread.java:7656) в java.lang.reflect.Метод.вызов(Собственный метод) в com.android.internal.os.RuntimeInit$MethodAndArgsCaller.запуск(RuntimeInit.java:592) в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) Вызвано: java.исключение lang.RuntimeException: Не удается создать экземпляр класса com.пример.фотоальбом.myimagesviewмодель на androidx.жизненный цикл.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:236) в androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:171) в androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:139) по адресу com.пример.фотоальбом.MainActivity.onCreate(MainActivity.java:35) в android.app.Activity.performCreate(Активность.java:8000) в android.app.Activity.performCreate(Активность.java:7984) в android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309) в android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422) в android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) в android.app.servertransaction.LaunchActivityItem.выполнить(LaunchActivityItem.java:85) в android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) в android.app.servertransaction.TransactionExecutor.выполнить(TransactionExecutor.java:95) в android.app.ActivityThread$H. handleMessage(ActivityThread.java:2066) в android.os.Handler.DispatchMessage(обработчик.java:106) в android.os.Looper.loop(петля.java:223) в android.app.ActivityThread.main(ActivityThread.java:7656) в java.lang.reflect.Метод.вызов(Собственный метод) в com.android.internal.os.RuntimeInit$MethodAndArgsCaller.запуск(RuntimeInit.java:592) в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) Вызвано: java.lang.отражает.Исключение вызова в java.lang.reflect.Конструктор.Новая установка0(Собственный метод) в java.lang.reflect.Конструктор.Новая установка(конструктор.java:343) в androidx.жизненный цикл.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:228) в androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:171) в androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:139) по адресу com.пример.фотоальбом.В MainActivity.метод onCreate(в MainActivity.в Java:35) на Android.приложение.Активность.performCreate(деятельности.Ява:8000) на Android.приложение.Активность.performCreate(деятельности.Ява:7984) на Android.приложение.Контрольно-измерительные приборы.callActivityOnCreate(контрольно-измерительные приборы.в Java:1309) на Android.приложение.ActivityThread.performLaunchActivity(ActivityThread.в Java:3422) на Android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) в android.app.servertransaction.LaunchActivityItem.выполнить(LaunchActivityItem.java:85) в android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) в android.app.servertransaction.TransactionExecutor.инструкции execute(TransactionExecutor.Ява:95) на Android.приложение.ActivityThread$Х. handlemessage в(ActivityThread.в Java:2066) на Android.ОС.Обработчик.dispatchMessage(обработчика.Ява:106) на Android.ОС.Петлитель.петли(лупер.в Java:223) на Android.приложение.ActivityThread.основной(ActivityThread.Ява:7656) в Java.лэнг,подумай.Метод.вызов(Собственный метод) в com.android.internal.os.RuntimeInit$MethodAndArgsCaller.запуск(RuntimeInit.java:592) в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) Вызвано: java.lang.Исключение NullPointerException: Попытка вызвать виртуальный метод ‘com.пример.фотоальбом.MyImagesDAO com.пример.фотоальбом.MyImagesDatabase.myImagesDAO()’ по нулевой ссылке на объект в com.пример.фотоальбом.Мои фоторепортажи.(MyImagesRepository.java:19) на com.пример.фотоальбом.myimagesviewмодель.(MyImagesVIewModel.java:22) на java.лэнг,подумай.Конструктор.newInstance0(Собственный метод) в java.lang.reflect.Конструктор.Новая установка(конструктор.java:343) в androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:228) в androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:171) в androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:139) по адресу com.пример.фотоальбом.MainActivity.onCreate(MainActivity.java:35) в android.app.Activity.performCreate(Активность.java:8000) в android.app.Activity.performCreate(Активность.java:7984) в android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309) в android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422) в android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) в android.app.servertransaction.LaunchActivityItem.выполнить(LaunchActivityItem.java:85) в android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) в android.app.servertransaction.TransactionExecutor.выполнить(TransactionExecutor.java:95) в android.app.ActivityThread$H. handleMessage(ActivityThread.java:2066) в android.os.Handler.DispatchMessage(обработчик.java:106) в android.os.Looper.loop(петля.java:223) в android.app.ActivityThread.main(ActivityThread.java:7656) в java.lang.reflect.Метод.вызов(собственный метод) в com.android.internal.os.RuntimeInit$MethodAndArgsCaller.запуск(RuntimeInit.java:592) в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 2021-10-08 09:18:55.708 23415-23415/com.пример.ввод/обработка фотоальбома: Отправка сигнала. PID: 23415 SIG: 9

here is the Viewmodel class

 package com.example.photoalbum;

import android.app.Application;
import android.content.Context;

import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProvider;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;

import java.util.List;

public class MyImagesVIewModel extends AndroidViewModel {

     private MyImagesRepository repository;
     private LiveData<List<MyImages>> imageList;
    public MyImagesVIewModel(@NonNull Application application) {
        super(application);
        repository = new MyImagesRepository(application);
        imageList = repository.getAllImages();
    }

    public void insert(MyImages myImages){
        repository.insert(myImages);
    }

    public void delete(MyImages myImages){
        repository.delete(myImages);
    }

    public void update(MyImages myImages){
        repository.update(myImages);
    }

    public LiveData<List<MyImages>> getAllImages(){
        return imageList;
    }
}

here is my repository classs

package com.example.photoalbum;

import android.app.Application;
import android.os.AsyncTask;

import androidx.lifecycle.LiveData;

import java.util.ArrayList;
import java.util.List;

public class MyImagesRepository {

    private MyImagesDAO myImagesDAO;
    private LiveData<List<MyImages>> imagesList;

    public MyImagesRepository(Application application){

        MyImagesDatabase database = MyImagesDatabase.getInstance(application);
        myImagesDAO = database.myImagesDAO();
        imagesList = myImagesDAO.getAllImages();
    }

    public void insert(MyImages myImages){

        new InsertImageAsyncTask(myImagesDAO).execute(myImages);
    }

    public void delete(MyImages myImages){

        new DeleteImageAsyncTask(myImagesDAO).execute(myImages);
    }

    public void update(MyImages myImages){

        new UpdateImageAsyncTask(myImagesDAO).execute(myImages);
    }

    public LiveData<List<MyImages>> getAllImages(){

        return imagesList;
    }

    public static class InsertImageAsyncTask extends AsyncTask<MyImages,Void,Void>{

        MyImagesDAO myImagesDAO;

        public InsertImageAsyncTask(MyImagesDAO myImagesDAO) {
            this.myImagesDAO = myImagesDAO;
        }

        @Override
        protected Void doInBackground(MyImages... myImages) {
            myImagesDAO.insert(myImages[0]);
            return null;
        }
    }

    public static class DeleteImageAsyncTask extends AsyncTask<MyImages,Void,Void>{

        MyImagesDAO myImagesDAO;

        public DeleteImageAsyncTask(MyImagesDAO myImagesDAO) {
            this.myImagesDAO = myImagesDAO;
        }

        @Override
        protected Void doInBackground(MyImages... myImages) {
            myImagesDAO.delete(myImages[0]);
            return null;
        }
    }

    public static class UpdateImageAsyncTask extends AsyncTask<MyImages,Void,Void>{

        MyImagesDAO myImagesDAO;

        public UpdateImageAsyncTask(MyImagesDAO myImagesDAO) {
            this.myImagesDAO = myImagesDAO;
        }

        @Override
        protected Void doInBackground(MyImages... myImages) {
            myImagesDAO.update(myImages[0]);
            return null;
        }
    }
}
 

here is my mainactivity

 package com.example.photoalbum;

import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;

import com.google.android.material.floatingactionbutton.FloatingActionButton;

import java.util.List;

public class MainActivity extends AppCompatActivity {

    private MyImagesVIewModel myImagesVIewModel;
    private RecyclerView rv;
    private FloatingActionButton fab;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        rv = findViewById(R.id.rv);
        fab = findViewById(R.id.fab);
        rv.setLayoutManager(new LinearLayoutManager(this));
        MyImagesAdapter adapter = new MyImagesAdapter();
        rv.setAdapter(adapter);
        myImagesVIewModel = new ViewModelProvider.AndroidViewModelFactory(getApplication())
                    .create(MyImagesVIewModel.class);
        //ViewModelProvider.Factory
        // which may create AndroidViewModel and ViewModel, which have an empty constructor.
        myImagesVIewModel.getAllImages().observe(MainActivity.this, new Observer<List<MyImages>>() {
            @Override
            public void onChanged(List<MyImages> myImages) {//called when data is changed

                adapter.setImagesList(myImages);
            }
            //observer updates the UI
        });

        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent = new Intent(MainActivity.this, AddImageActivity.class);
                startActivityForResult(intent, 3);
            }
        });

    }
}
 

вот мой класс репозитория

 package com.example.photoalbum;

import android.app.Application;
import android.os.AsyncTask;

import androidx.lifecycle.LiveData;

import java.util.ArrayList;
import java.util.List;

public class MyImagesRepository {

    private MyImagesDAO myImagesDAO;
    private LiveData<List<MyImages>> imagesList;

    public MyImagesRepository(Application application){

        MyImagesDatabase database = MyImagesDatabase.getInstance(application);
        myImagesDAO = database.myImagesDAO();
        imagesList = myImagesDAO.getAllImages();
    }

    public void insert(MyImages myImages){

        new InsertImageAsyncTask(myImagesDAO).execute(myImages);
    }

    public void delete(MyImages myImages){

        new DeleteImageAsyncTask(myImagesDAO).execute(myImages);
    }

    public void update(MyImages myImages){

        new UpdateImageAsyncTask(myImagesDAO).execute(myImages);
    }

    public LiveData<List<MyImages>> getAllImages(){

        return imagesList;
    }

    public static class InsertImageAsyncTask extends AsyncTask<MyImages,Void,Void>{

        MyImagesDAO myImagesDAO;

        public InsertImageAsyncTask(MyImagesDAO myImagesDAO) {
            this.myImagesDAO = myImagesDAO;
        }

        @Override
        protected Void doInBackground(MyImages... myImages) {
            myImagesDAO.insert(myImages[0]);
            return null;
        }
    }

    public static class DeleteImageAsyncTask extends AsyncTask<MyImages,Void,Void>{

        MyImagesDAO myImagesDAO;

        public DeleteImageAsyncTask(MyImagesDAO myImagesDAO) {
            this.myImagesDAO = myImagesDAO;
        }

        @Override
        protected Void doInBackground(MyImages... myImages) {
            myImagesDAO.delete(myImages[0]);
            return null;
        }
    }

    public static class UpdateImageAsyncTask extends AsyncTask<MyImages,Void,Void>{

        MyImagesDAO myImagesDAO;

        public UpdateImageAsyncTask(MyImagesDAO myImagesDAO) {
            this.myImagesDAO = myImagesDAO;
        }

        @Override
        protected Void doInBackground(MyImages... myImages) {
            myImagesDAO.update(myImages[0]);
            return null;
        }
    }
}
 

Ответ №1:

Это происходит из NullPointerExcepion -за того, что в ViewModel конструкторе.

Вы видите это в журналах.

 java.lang.NullPointerException: Attempt to invoke virtual method 'com.example.photoalbum.MyImagesDAO com.example.photoalbum.MyImagesDatabase.myImagesDAO()' on a null object reference at com.example.photoalbum.MyImagesRepository.
 

В вашем классе репозитория

 public MyImagesRepository(Application application){
        MyImagesDatabase database = MyImagesDatabase.getInstance(application);
        myImagesDAO = database.myImagesDAO(); //here database seems to be null.
        imagesList = myImagesDAO.getAllImages();
    }
 

Комментарии:

1. как это решить?

Ответ №2:

Может быть, что-то не так в конструкторе вашей модели просмотра. Попробуйте этот конструктор-

   myImagesVIewModel=new ViewModelProvider(this,ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication())).get( MyImagesVIewModel.class);