【问题标题】:android studio :Attempt to invoke virtual method on a null object referenceandroid studio:尝试在空对象引用上调用虚拟方法
【发布时间】:2018-12-08 21:58:13
【问题描述】:

有人可以帮助我吗?每当我单击 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$1$1.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)

【问题讨论】:

  • 请张贴logcat!是的,我可以在导致崩溃的代码中看到错误!但也可能还有一个原因!所以请提供你的错误的logcat
  • 你在堆栈跟踪中遇到什么错误..
  • 最终 EditText e1 = (EditText) promptView.findViewById(R.id.editText);您需要如上所述更改您的edittext初始化
  • @rizwanatta 我安装了 logcat 并尝试了你的建议。该应用程序仍然崩溃。有什么帮助吗?
  • @LonelyBat 检查答案编辑!我编辑了有帮助的答案!你没有初始化数据库!看到答案并关注它

标签: java android sqlite android-studio sqliteopenhelper


【解决方案1】:

在您按钮的 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 数据库

,这可以像这样SOLVE
//----- 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");
        }

    }

【讨论】:

  • 嘿,我试过了,但还是不行。我们可以在某个地方谈谈吗?
  • 我没有声明我的数据库助手 LOL。非常感谢
  • 你能帮我解决我的新问题吗?也许我们可以在这里讨论它,因为问题被搁置了
  • @LonelyBat 是的,为什么不呢!
猜你喜欢
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
相关资源
最近更新 更多