由于在空对象引用上调用虚方法,无法启动列表视图活动。提示?

时间:2016-07-31 11:15:16

标签: java android listview virtual-method

抱歉这个愚蠢而重复的问题。我是Android编程的新手,正在制作一个可以扫描QR码并将数据保存到SQLite数据库并在另一个活动的ListView中显示的应用程序。 此外,ListView还有一个"搜索"使用户能够键入文本的功能,该文本将从列表视图中的项目中显示类似的结果(如果在列表视图中找到)。最后,当用户点击项目时,删除功能会从ListView中删除该项目。

应用程序工作正常并打开了ListView Activity,显示了包含内容的ListView,直到我集成了搜索和删除功能。 该应用程序声明我试图在空对象引用上调用虚方法。我已经查明了如何解决它,但无法找到任何东西。 现在它显示了这个错误:

07-31 18:52:31.688 2900-2900/app.num.barcodescannerproject E/AndroidRuntime: FATAL EXCEPTION: main
    Process: app.num.barcodescannerproject, PID: 2900
    java.lang.RuntimeException: Unable to start activity ComponentInfo{app.num.barcodescannerproject/app.num.barcodescannerproject.ListActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void app.num.barcodescannerproject.CustomCursorAdapter.changeCursor(android.database.Cursor)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2442)
at android.app.ActivityThread.access$800(ActivityThread.java:156)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:211)
at android.app.ActivityThread.main(ActivityThread.java:5389)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void app.num.barcodescannerproject.CustomCursorAdapter.changeCursor(android.database.Cursor)' on a null object reference
at app.num.barcodescannerproject.ListActivity.onCreate(ListActivity.java:41)
at android.app.Activity.performCreate(Activity.java:5990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2332)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2442) 
at android.app.ActivityThread.access$800(ActivityThread.java:156) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:211) 
at android.app.ActivityThread.main(ActivityThread.java:5389) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815) 
07-31 18:52:32.968 2900-2900/app.num.barcodescannerproject I/Process: Sending signal. PID: 2900 SIG: 9

以下是Activity的代码,它将带有数据的Intent发送到ListView Activity:

 public void saveOnClick (View saveButton){
    String prescriptionName = scanResult.getText().toString();
if (prescriptionName.length() != 0) {
Intent newIntent = new Intent (this, ListActivity.class);
    newIntent.putExtra("tag_person_name", prescriptionName);
startActivity(newIntent);
finish();
    }
}

这是ListActivity的代码,带有ListView,搜索和删除功能:

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    databaseHelper = new PersonDatabaseHelper(this);

    listView = (ListView) findViewById(R.id.list_data);
    databaseHelper.insertData(getIntent().getExtras().getString("tag_person_name"));
    customAdapter.changeCursor(databaseHelper.getAllData());
    listView.setOnItemClickListener(listContentOnItemClickListener);


    customAdapter = new CustomCursorAdapter(ListActivity.this, databaseHelper.getAllData());
    listView.setAdapter(customAdapter);
    Cursor cursor = databaseHelper.getAllData();


    EditText myFilter = (EditText) findViewById(R.id.editText);
    myFilter.addTextChangedListener(new TextWatcher() {

        public void afterTextChanged(Editable s) {
        }

        public void beforeTextChanged(CharSequence s, int start,
                                      int count, int after) {
        }

        public void onTextChanged(CharSequence s, int start,
                                  int before, int count) {
            customAdapter.getFilter().filter(s.toString());
        }
    });

    customAdapter.setFilterQueryProvider(new FilterQueryProvider() {
        public Cursor runQuery(CharSequence constraint) {
            return databaseHelper.fetchDataByName(constraint.toString());
        }
    });
}


//public void onClickEnterData(View btnAdd) {
//  startActivityForResult(new Intent(this, ResultActivity.class), ENTER_DATA_REQUEST_CODE);
//}

// @Override
//protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//   super.onActivityResult(requestCode, resultCode, data);
// if (requestCode == ENTER_DATA_REQUEST_CODE && resultCode == RESULT_OK) {
//  databaseHelper.insertData(data.getExtras().getString("tag_person_name"));
//   customAdapter.changeCursor(databaseHelper.getAllData());
// }
// }
private OnItemClickListener listContentOnItemClickListener
        = new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
                            long id) {
        // TODO Auto-generated method stub


        Cursor cursor = (Cursor) parent.getItemAtPosition(position);
        final int item_id = cursor.getInt(cursor.getColumnIndex(PersonDatabaseHelper.PERSON_TABLE_COLUMN_ID));
        String item_name = cursor.getString(cursor.getColumnIndex(PersonDatabaseHelper.PERSON_TABLE_COLUMN_NAME));


        AlertDialog.Builder myDialog
                = new AlertDialog.Builder(ListActivity.this);

        myDialog.setTitle("Delete?");

        TextView dialogTxt_id = new TextView(ListActivity.this);
        ViewGroup.LayoutParams dialogTxt_idLayoutParams
                = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        dialogTxt_id.setLayoutParams(dialogTxt_idLayoutParams);
        dialogTxt_id.setText(String.valueOf(item_id));

        TextView dialogC1_id = new TextView(ListActivity.this);
        ViewGroup.LayoutParams dialogC1_idLayoutParams
                = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        dialogC1_id.setLayoutParams(dialogC1_idLayoutParams);
        dialogC1_id.setText(item_name);


        LinearLayout layout = new LinearLayout(ListActivity.this);
        layout.setOrientation(LinearLayout.VERTICAL);
        layout.addView(dialogTxt_id);
        layout.addView(dialogC1_id);
        myDialog.setView(layout);

        myDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            // do something when the button is clicked
            public void onClick(DialogInterface arg0, int arg1) {
                databaseHelper.delete_byID(item_id);
                updateList();
            }
        });

        myDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            // do something when the button is clicked
            public void onClick(DialogInterface arg0, int arg1) {

            }
        });

        myDialog.show();
    }
};

@Override
protected void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    databaseHelper.close();
}


private void updateList() {

    customAdapter.changeCursor(databaseHelper.getAllData());
}

}

根据我所看到的,错误就在这里,在changeCursor:

 databaseHelper.insertData(getIntent().getExtras().getString("tag_person_name"));
    customAdapter.changeCursor(databaseHelper.getAllData());
    listView.setOnItemClickListener(listContentOnItemClickListener);

我还注意到,当我删除changeCursor时,错误将显示在setOnItemClickListener上,说明此虚方法也在空对象引用上调用。

我能做些什么吗?我已经在很多网站上进行了广泛的搜索,但无法在任何地方找到解决方案。也许我是瞎子。

更新:感谢您的帮助,我意识到我没有首先初始化customAdapter。但是,现在我做了,我继续得到两个与customAdapater完全相同的NPE错误,除了第一个是setOnItemClickListener,另一个是listView.setAdapter。两者显然也是在null对象上调用的。但是这一次,与customAdapter不同,我真的无法发现错误。有什么帮助吗?

2 个答案:

答案 0 :(得分:0)

首次使用后,您正在初始化CursorAdapter。这是错误的,因为您在使用之前首先需要创建CursorAdapter对象。

    ...

    databaseHelper.insertData(getIntent().getExtras().getString("tag_person_name"));
/* This line is moved from below to this place i.e before you use the changeCursor method on it*/
    customAdapter = new CustomCursorAdapter(ListActivity.this, databaseHelper.getAllData()); 
customAdapter.changeCursor(databaseHelper.getAllData());
    listView.setOnItemClickListener(listContentOnItemClickListener);

    ...

您正在获取空指针异常( NPE ),因为您正在使用尚未使用 new 运算符创建的对象

答案 1 :(得分:0)

此行也应在Model model = qexec.execConstruct(); // instead of execSelect(); 宣布之前先行?

customAdpater