【解決方法】Java.lang.nullpointerException: null オブジェクト参照で仮想メソッド ‘java.lang.string java.lang.object.tostring()’ を呼び出そうとしています

プログラミングQA


エラーがあります

Process: id.ac.astra.polytechnic.toolmaintenance, PID: 22120
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
    at id.ac.astra.polytechnic.toolmaintenance.viewModel.RoleListViewModel.addRole(RoleListViewModel.java:53)
    at id.ac.astra.polytechnic.toolmaintenance.AddRoleFragment$2.onClick(AddRoleFragment.java:79)
    at android.view.View.performClick(View.java:7756)
    at android.view.View.performClickInternal(View.java:7729)
    at android.view.View.access$3700(View.java:860)
    at android.view.View$PerformClick.run(View.java:29318)
    at android.os.Handler.handleCallback(Handler.java:938)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loopOnce(Looper.java:210)
    at android.os.Looper.loop(Looper.java:299)
    at android.app.ActivityThread.main(ActivityThread.java:8298)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:576)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1073)

そしてこれが私のコードです:
AddRoleFragment.java

public class AddRoleFragment extends Fragment {
    private Role mRole;
    private EditText roleName;
    private RoleListViewModel mRoleListViewModel;


    public static AddRoleFragment newInstance() {
        return new AddRoleFragment();
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        Log.i(TAG, "UserFragment.onCreate() called");

        mRole = new Role();
        mRoleListViewModel = new ViewModelProvider(this)
                .get(RoleListViewModel.class);

    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.add_role, container, false);

        Button btnSimpan = view.findViewById(R.id.btnSimpan);
        roleName = view.findViewById(R.id.inputNamaJabatan);
        roleName.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence s, int i, int i1, int i2) {
               mRole.setRolename(s.toString());
            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });
        btnSimpan.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Ketika btnPeminjaman ditekan, tampilkan PeminjamanFragment

            //    mRole.setRolename(String.valueOf(roleName));

                mRoleListViewModel.addRole(mRole);

                Fragment peminjamanFragment = ListKelolaRoleFragment.newInstance();
                FragmentManager fragmentManager = getFragmentManager();
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.replace(R.id.fragment_container, peminjamanFragment, "peminjaman");
                fragmentTransaction.addToBackStack(null);
                fragmentTransaction.commit();
            }
        });

        return view;
    }
}

役割リストビューモデル.java

public class RoleListViewModel extends ViewModel {

    private MutableLiveData<List<Role>> mRoleListMutableLiveData;
    private RoleRepository mRoleRepository;

    public RoleListViewModel(){
        Log.d(TAG, "RoleListViewModel constructor called");
        mRoleRepository = RoleRepository.get();

    }
    public MutableLiveData<List<Role>> Roles(){
        mRoleListMutableLiveData = mRoleRepository.Roles();
        Log.d(TAG,"RoleListViewModel.getRoles() called ="+
                mRoleListMutableLiveData.toString());
        return mRoleListMutableLiveData;
    }

    public void addRole (Role Role) {

        mRoleRepository.addRole (Role);
        Log.d(TAG,"RoleListViewModel.getRoles() called ="+
                mRoleListMutableLiveData.toString());
    }
    }

役割リポジトリ

public class RoleRepository {
    private static final String TAG = "RoleRepository";
    public static RoleRepository INSTANCE;

    private RoleService mRoleService;

    private MutableLiveData<List<Role>> mRoleListMutableLiveData;

    //hubungan dgn APIutils utk daepetin fungsi
    private RoleRepository(Context context) {
        mRoleService = ApiUtils.getRoleService();
    }

    public static void initialize(Context context) {
        if (INSTANCE == null) {
            INSTANCE = new RoleRepository(context);
        }
    }
    private  RoleRepository(){

    }
    public static RoleRepository get() {

        return INSTANCE;
    }

    public MutableLiveData<List<Role>> Roles() {
        MutableLiveData<List<Role>> Roles = new MutableLiveData<List<Role>>();

        Call<List<Role>> call = mRoleService.Roles();
        call.enqueue(new Callback<List<Role>>() {
            @Override
            public void onResponse(Call<List<Role>> call, Response<List<Role>> response) {
                if (response.isSuccessful()) {
                    Roles.setValue(response.body());
                    Log.d(TAG, "getRoles.onResponse() called");
                }
            }

            @Override
            public void onFailure(Call<List<Role>> call, Throwable t) {
                Log.e("Error API call :", t.getMessage());
            }
        });
        return Roles;
    }

    public void addRole(Role Role){
        Log.i(TAG, "addRole() called");
        Call <Role> call = mRoleService.addRole (Role);
        Log.i(TAG, "addRole2() called");

        call.enqueue(new Callback<Role>() {
            @Override
            public void onResponse (Call<Role> call, Response <Role> response) { if (response.isSuccessful()){
                Log.i(TAG, "Role added " + Role.getRolename());
            }
            }
            @Override
            public void onFailure (Call<Role> call, Throwable t) {
                Log.e("Error API call ", t.getMessage());
            }
        });
    }
}

私が試したこと:

このエラーを解決するのを手伝ってください

解決策 1

これは私たちが尋ねられる最も一般的な問題の 1 つであり、私たちが答える能力が最も低い問題でもありますが、あなたには自分自身で答える能力が最も備わっています。

エラーの意味を簡単に説明します。変数、プロパティ、またはメソッドの戻り値を使用しようとしましたが、null が含まれています。これは、変数にクラスのインスタンスが存在しないことを意味します。
これはポケットに似ています。シャツにペンを入れるためのポケットがあります。 ポケットに手を入れても、そこにペンがないことがわかったら、紙に自分の名前を署名することはできません。署名しようとすると、非常に面白い見た目になるでしょう。 空のポケットでは null 値 (ここにはペンがありません!) が与えられるため、ペンを取り出した後は通常行うような操作ができなくなります。 なぜ空いているのでしょうか? それが問題です。もしかしたら、今朝家を出るときにペンを拾うのを忘れたのかもしれません。あるいは、昨夜シャツを脱いだときに、昨日のシャツのポケットにペンを入れたままにしたのかもしれません。

私たちはその場にいなかったのでわかりません。さらに重要なことに、ポケットの中に何が入っているかはおろか、あなたのシャツさえ見えません。

コンピュータに戻ると、あなたも同じことを何らかの形で行っていますが、私たちはあなたのコードを見ることはできず、ましてやコードを実行して、null が含まれているべきではないものを見つけることもできません。
しかし、それは可能です。ここでは IDE が役に立ちます。 デバッガーでプログラムを実行すると、プログラムが失敗すると、問題が見つかった行が表示されます。 次に、そのさまざまな部分を調べてどの値が null であるかを確認し、コードを遡ってその理由を調べることができます。 したがって、エラー行を含むメソッドの先頭にブレークポイントを設定し、プログラムを最初から再度実行します。 今回は、デバッガーはエラーが発生する前に停止し、値を確認しながらコードをステップ実行することで、何が起こっているかを調べることができます。

しかし、私たちにはそれができません。私たちはあなたのコードを持っていません。コードを持っていたとしてもその使い方がわかりません。また、あなたのデータもありません。 ぜひ試してみてください。どれだけの情報が得られるか試してみてください。

コメント

タイトルとURLをコピーしました