-1

Hey guys I am working on a simple To-do list app for an assignment. In my app there is an error which occurs when I click the listView item. It is supposed to open a dialog in which I can edit the item. However, instead the app crashes and this error message is shown:

10-18 09:01:24.463 12767-12767/com.example.ayush.todolistapp E/AndroidRuntime: FATAL EXCEPTION: main
                                                                           Process: com.example.ayush.todolistapp, PID: 12767
                                                                           java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String[] java.lang.String.split(java.lang.String)' on a null object reference
                                                                               at com.example.ayush.todolistapp.MainActivity.fillReplaceDialog(MainActivity.java:140)
                                                                               at com.example.ayush.todolistapp.MainActivity$2.onItemClick(MainActivity.java:56)
                                                                               at android.widget.AdapterView.performItemClick(AdapterView.java:310)
                                                                               at android.widget.AbsListView.performItemClick(AbsListView.java:1147)
                                                                               at android.widget.AbsListView$PerformClick.run(AbsListView.java:3068)
                                                                               at android.widget.AbsListView$3.run(AbsListView.java:3916)
                                                                               at android.os.Handler.handleCallback(Handler.java:739)
                                                                               at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                               at android.os.Looper.loop(Looper.java:152)
                                                                               at android.app.ActivityThread.main(ActivityThread.java:5497)
                                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

I am not able to find the root of the problem and so it would be really helpful if someone could help me out. Here is the mainActivity file :

    public class MainActivity extends AppCompatActivity {

    Dialog dialog;
    myDatabase database = new myDatabase(this);
    ArrayList<Data> list = new ArrayList<>();
    int numberOfItems = 0;
    ListView listView;
    EditText et1;
    EditText et2;
    DatePicker dp1;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        listView = (ListView) findViewById(R.id.mylist);
        list = database.returnProduct();
        CustomAdapter adapter = new CustomAdapter(MainActivity.this,list);
        listView.setAdapter(adapter);

        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                database.setAsComplete(position);
                Toast.makeText(MainActivity.this, "Item saved as completed", Toast.LENGTH_SHORT).show();
                return false;
            }
        });
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                fillReplaceDialog(position);
                String title = list.get(position).getTitle();
                String desc = list.get(position).getDescription();
                String final_date = list.get(position).getDueDate();
                String[] date = final_date.split("/");//here is where the error is occurring
                int day = Integer.parseInt(date[0]);
                int month = Integer.parseInt(date[1]);
                int year = Integer.parseInt(date[2]);
                et1.setText(title);
                et2.setText(desc);
                dp1.updateDate(year,month,day);

            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        if (id == R.id.completed_tasks){
            Intent intent = new Intent(MainActivity.this, Main2Activity.class);
            startActivity(intent);
        }
        else if (id == R.id.add_items){
            fillDialog();
        }

        return super.onOptionsItemSelected(item);
    }

    public void fillDialog(){

        dialog = new Dialog(this);
        dialog.setCanceledOnTouchOutside(false);
        dialog.setContentView(R.layout.dialog_layout);
        dialog.show();
        Button bt_save= (Button) dialog.findViewById(R.id.button);
        listView = (ListView) findViewById(R.id.mylist);
        et1 = (EditText) dialog.findViewById(R.id.et_title);
        et2 = (EditText) dialog.findViewById(R.id.et_description);
        dp1= (DatePicker) dialog.findViewById(R.id.datePicker);
        bt_save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String title = et1.getText().toString();
                String description = et2.getText().toString();
                int day = dp1.getDayOfMonth();
                int month = dp1.getMonth();
                int year = dp1.getYear();
                String final_date = day+"/"+month+"/"+year;
                database.insert_Data(title,description,final_date);
                numberOfItems+=1;
                dialog.dismiss();
                list = database.returnProduct();
                CustomAdapter adapter = new CustomAdapter(MainActivity.this,list);
                listView.setAdapter(adapter);
            }
        });
        Button bt_cancel = (Button) dialog.findViewById(R.id.button2);
        bt_cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //automatically dismisses the dialog on pressing the cancel button
                dialog.dismiss();
            }
        });
    }

    public void fillReplaceDialog(final int position){
        dialog = new Dialog(this);
        dialog.setCanceledOnTouchOutside(false);
        dialog.setContentView(R.layout.dialog_layout);
        dialog.show();
        Button bt_save= (Button) dialog.findViewById(R.id.button);
        listView = (ListView) findViewById(R.id.mylist);
        et1 = (EditText) dialog.findViewById(R.id.et_title);
        et2 = (EditText) dialog.findViewById(R.id.et_description);
        dp1= (DatePicker) dialog.findViewById(R.id.datePicker);
        bt_save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String title = et1.getText().toString();
                String description = et2.getText().toString();
                int day = dp1.getDayOfMonth();
                int month = dp1.getMonth();
                int year = dp1.getYear();
                String final_date = day+"/"+month+"/"+year;
                database.replaceObject(title,description,final_date, position);
                dialog.dismiss();
                list = database.returnProduct();
                CustomAdapter adapter = new CustomAdapter(MainActivity.this,list);
                listView.setAdapter(adapter);
            }
        });
        Button bt_cancel = (Button) dialog.findViewById(R.id.button2);
        bt_cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //automatically dismisses the dialog on pressing the cancel button
                dialog.dismiss();
            }
        });
    }
}

Data Class:

 public class Data {

    String title;
    String description;
    String dueDate;
    int status;

    public String getTitle() {
        return title;
    }

    public String getDescription() {
        return description;
    }

    public String getDueDate() {
        return dueDate;
    }

    public int getStatus() {
        return status;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public void setDueDate(String dueDate) {
        this.dueDate = dueDate;
    }

    public void setStatus(int status) {
        this.status = status;
    }
}

CustomAdapter class:

 public class CustomAdapter extends BaseAdapter {
    private Context mContext;
    private ArrayList<Data> mData;
    LayoutInflater mInflator;

    public CustomAdapter(Context context, ArrayList<Data> list){
        mContext = context;
        mData = list;
        mInflator = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }


    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public Object getItem(int position) {

        return mData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        convertView = mInflator.inflate(R.layout.row_layout, parent, false);
        //inflates the layout
        TextView tv1 = (TextView) convertView.findViewById(R.id.textView);
        TextView tv2 = (TextView) convertView.findViewById(R.id.textView2);
        TextView tv3 = (TextView) convertView.findViewById(R.id.textView3);
        TextView header = (TextView) convertView.findViewById(R.id.header_title);
        ImageView iv1 = (ImageView) convertView.findViewById(R.id.imageView);
        tv1.setText(mData.get(position).getTitle());
        tv2.setText(mData.get(position).getDescription());
        tv3.setText(mData.get(position).getDueDate());
        iv1.setImageResource(R.drawable.incomplete);
        header.setText(mData.get(position).getDueDate());
        return convertView;
        //returns the view
    }
}

I'm only a beginner and have only recently started learning android programming so please excuse any silly mistakes. Thanks in advance

user207421
  • 305,947
  • 44
  • 307
  • 483
Ayush Gharat
  • 41
  • 1
  • 8

3 Answers3

1
 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String[] java.lang.String.split(java.lang.String)' on a null object reference

NullPointerException is thrown when an application attempts to use an object reference that has the null value.

Problem Coming from

String final_date = list.get(position).getDueDate(); // At first value getting null
String[] date = final_date.split("/"); // Didn't find "/" in STRING that's why CRASHING .

FYI, Run your APP in DEBUG mode. You can find answer.

final_date is null. You should check checking STRING null or not .

if (final_date != null && !final_date.isEmpty())
{
 String[] date = final_date.split("/");
  ........// Your code //............
}
else
{
  // Your String null ;
}
IntelliJ Amiya
  • 74,896
  • 15
  • 165
  • 198
0

Try printing the value final_date in console. I think getDueDate() returning the null i.e Item may not having the due date.

user3438583
  • 155
  • 1
  • 2
  • 8
-2

Check DateFormat is ("dd/mm/yyyy") proper or not. if / is not found in DateFormat then final_date.split("/") is not work.

You can also get the day, month, year like this.

  DateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");
  Date date = formatter.parse("10/18/2017");  
  int month = date.getMonth();
  int day= date.getDay();
  int year = date.getYear();    
Jigar Patel
  • 1,550
  • 2
  • 13
  • 29