android 工作室:尝试在空对象引用上调用虚拟方法

android studio :Attempt to invoke virtual method on a null object reference

有人可以帮助我吗?每当我点击 dialoginterface.onclicklistener 按钮时,应用程序就会崩溃,谁能帮我检查我的代码。另外,当我想要相同的对话框界面按钮从数据库中检索插入的数据以将其视为列表视图时,我会提供数据库和页面代码

public class mainscreen extends AppCompatActivity {
    private static final String TAG = "ListDataActivity";
    ImageButton add;
    DatabaseHelper db;
    private ListView listView;

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

        listView = (ListView)findViewById(R.id.listview);

        add = (ImageButton) findViewById(R.id.addbtn);
        //populateListView();

        add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final AlertDialog.Builder builder = new AlertDialog.Builder(mainscreen.this);
                View mView = getLayoutInflater().inflate(R.layout.promptexercise,null);
                final EditText addexerText = (EditText)mView.findViewById(R.id.editText2);
                Button cancel = (Button) mView.findViewById(R.id.button4);
                Button ok = (Button) mView.findViewById(R.id.button3);
                ok.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        String newEntry = addexerText.getText().toString();
                        if (addexerText.length() != 0) {
                            AddExerData(newEntry);
                            addexerText.setText("");
                        }else{
                            toastMessage("You must enter an exercise name in the field!");
                        }
                        Toast.makeText(mainscreen.this, newEntry, Toast.LENGTH_SHORT).show();

                    }
                });



                builder.setView(mView);
                AlertDialog dialog = builder.create();
                dialog.show();
                dialog.create();




            }
        });




        }
    //----- method to add data into database
    public void AddExerData(String newEntry){
        boolean insertData = db.addexerData(newEntry);
        if(insertData){
            toastMessage("Data Successfully Inserted");
        }else{
            toastMessage("Something went wrong");
        }

    }


   // private void populateListView(){
       // Log.d(TAG,"populateListView:Displaying data in the ListView");
        //get the data and append to a list
       // Cursor data = db.getData();
      //  //ArrayList<String>listData = new ArrayList<>();
       // while(data.moveToNext()){
            //get the value from the database from col 1 -id
            //then add it into arraylist
       // listData.add(data.getString(1));
       // }
      //  ListAdapter adapter = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,listData);
       // listView.setAdapter(adapter);
   // }


    //method to make the msg pop
    private void toastMessage(String message){
        Toast.makeText(this,message,Toast.LENGTH_SHORT).show();
    }

}

 LOGCAT
 
 Process: com.example.hibatulhadi.trackerapp2, PID: 643
    java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.example.hibatulhadi.trackerapp2.DatabaseHelper.addexerData(java.lang.String)' on a null object reference
        at com.example.hibatulhadi.trackerapp2.mainscreen.AddExerData(mainscreen.java:79)
        at com.example.hibatulhadi.trackerapp2.mainscreen.onClick(mainscreen.java:50)
        at android.view.View.performClick(View.java:6294)
        at android.view.View$PerformClick.run(View.java:24770)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

在你按钮的 clickListener 中,你正在膨胀第二个布局以显示在对话框中,其中似乎有一个编辑文本,它在创建加载对话框后被注册,这可能是这里的简单原因 你一般使用 findviewbyid 应该指定 膨胀的 视图的名称和它的 findViewbyid! 简单地把你的 clicklistener 代码应该看起来像这样!

       add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                LayoutInflater layoutInflater = LayoutInflater.from(mainscreen.this);
                View promptView = layoutInflater.inflate(R.layout.promptexercise, null);
                AlertDialog.Builder alertdialog = new AlertDialog.Builder(mainscreen.this);
                alertdialog.setView(promptView);
// here use findviewby id from your inflated view like this!
                final EditText e1 = (EditText) promptView.findViewById(R.id.editText);
                alertdialog.setCancelable(false)
                        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {

                                    String newEntry9 = e1.getText().toString();
                                    if (e1.length() != 0) {
                                        AddExerData(newEntry9);
                                        e1.setText("");
                                    } else {
                                        toastMessage("You must enter an exercise name in the field!");
                                    }
                                    Toast.makeText(mainscreen.this), newEntry9, Toast.LENGTH_SHORT).show();


                                }

                        })
                        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.cancel();
                            }
                        });
                alertdialog.create();
                alertdialog.show();

            }
        });

第二件东西不见了

在您的写入数据方法中,db 未初始化!那是导致崩溃的错误!在使用之前你必须先初始化它!

     //----- method to add data into database
        public void AddExerData(String newEntry){
// this db variable you are using! is not initialised!
            boolean insertData = db.addexerData(newEntry);
            if(insertData){
                toastMessage("Data Successfully Inserted");
            }else{
                toastMessage("Something went wrong");
            }

        }

也许 如果这是 SQLITE 数据库[=13,这可以 解决 =]

//----- SOLUTION method to add data into database
    public void AddExerData(String newEntry){
//      if you have a field (class level variable)  SqliteDatabase db;
        db = new YourDBHelperClass().getWriteabledatabase();
        boolean insertData = db.addexerData(newEntry);
        if(insertData){
            toastMessage("Data Successfully Inserted");
        }else{
            toastMessage("Something went wrong");
        }

    }