-1

i just followed a video tutorial on youtube to make a note application and I've done the same exact code with the tutorial. So whenever i want to go to Edit activity from detail activity by clicking the menu icon, the app just crashed and show an error log like this.

 java.lang.NullPointerException: Attempt to invoke virtual method 'long com.example.dairyapp.Diary.getID()' on a null object reference
        at com.example.dairyapp.Details.onOptionsItemSelected(Details.java:67)

I've read the similiar question but i still dont understand what's wrong with it, any tips ?

the error log refer to this lines in detail activity

public boolean onOptionsItemSelected(MenuItem item) {
    if(item.getItemId() == R.id.editDiary){
        Intent i = new Intent(this,Edit.class);
        i.putExtra("ID",diary.getID());
        startActivity(i);
    }
    return super.onOptionsItemSelected(item);
}

details.java

package com.example.dairyapp;

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

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

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class Details extends AppCompatActivity {
    TextView mDetails;
    DiaryDatabase db;
    Diary diary;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_details);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        mDetails = findViewById(R.id.detailsDairy);

        Intent i = getIntent();
        Long id = i.getLongExtra("ID",0);

        db = new DiaryDatabase(this);
        Diary diary = db.getDiary(id);
        getSupportActionBar().setTitle(diary.getJudul());
        mDetails.setText(diary.getIsi());

        Toast.makeText(this, "Tittle => "+ diary.getJudul(), Toast.LENGTH_SHORT).show();

        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                db.deleteDiary(diary.getID());
                Toast.makeText(getApplicationContext(), "Kegiatan Berhasil Dihapus", Toast.LENGTH_SHORT).show();
                startActivity(new Intent(getApplicationContext(),MainActivity.class));
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.edit_menu,menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if(item.getItemId() == R.id.editDiary){
            Intent i = new Intent(this,Edit.class);
            i.putExtra("ID",diary.getID());
            startActivity(i);
        }
        return super.onOptionsItemSelected(item);
    }

}

Edit.java

package com.example.dairyapp;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

import android.content.Intent;
import android.os.Bundle;
import android.widget.EditText;

import java.util.Calendar;

public class Edit extends AppCompatActivity {
    Toolbar toolbar;
    EditText juduldiary,isidiary;
    Calendar c;
    String todaysDate;
    String currentTime;

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

        Intent i = getIntent();
        Long id = i.getLongExtra("ID",0);
        DiaryDatabase db = new DiaryDatabase(this);
        Diary diary = db.getDiary(id);

        toolbar = findViewById(R.id.toolbar);
        toolbar.setTitleTextColor(getResources().getColor(R.color.white));
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setTitle(diary.getJudul());
    }
}
AdittyaK
  • 1
  • 2
  • Hi @AdittyaK perhaps this line `Diary diary = db.getDiary(id);` is the problem?? You are setting a local variable, not the object variable of the same name. Or perhaps you are forgetting to set it at the appropriate places - regardless this.diary is never set - hence the NPE. – Mr R Jun 05 '21 at 01:13
  • Yes that is the problem, i just changed it and its solved now. Thank u so much ! – AdittyaK Jun 05 '21 at 01:53

1 Answers1

0

Its because the dairy object at class never has never been initialized. Update the Details class onCreate method as follows:


public class Details extends AppCompatActivity {
    TextView mDetails;
    DiaryDatabase db;
    Diary diary;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_details);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        mDetails = findViewById(R.id.detailsDairy);

        Intent i = getIntent();
        Long id = i.getLongExtra("ID",0);

        db = new DiaryDatabase(this);
        diary = db.getDiary(id); // use class level variable here
        getSupportActionBar().setTitle(diary.getJudul());
        mDetails.setText(diary.getIsi());

        Toast.makeText(this, "Tittle => "+ diary.getJudul(), Toast.LENGTH_SHORT).show();

        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                db.deleteDiary(diary.getID());
                Toast.makeText(getApplicationContext(), "Kegiatan Berhasil Dihapus", Toast.LENGTH_SHORT).show();
                startActivity(new Intent(getApplicationContext(),MainActivity.class));
            }
        });
    }
deepakchethan
  • 5,240
  • 1
  • 23
  • 33