java.lang.IllegalStateException:无法执行Invocation和NPE错误导致的活动方法

时间:2015-02-24 05:19:08

标签: java android sqlite

我似乎无法弄清楚如何解决NPE错误。是因为我在插入时没有包含ID列吗?或者是因为db返回的数据类型不是long(或int)?

活动:

public class CreateActivity extends ActionBarActivity {
    Database db;
    SimpleDateFormat s = new SimpleDateFormat("ddMMyyyyhhmmss");


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


    }

    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.create, menu);
        return true;
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public void save(View v){
        EditText theitems = (EditText) findViewById(R.id.editText1);
        EditText thedescription = (EditText) findViewById(R.id.editText2);
        String items = theitems.getText().toString();
        String description=thedescription.getText().toString();
        long success = db.insertRecord(items, description);
        if (success != -1)
            Toast.makeText(getApplicationContext(), "Inserted",Toast.LENGTH_LONG).show();

    }

    public void save_send(View v){

        EditText theitems = (EditText)findViewById(R.id.editText1);
        EditText thedescription = (EditText)findViewById(R.id.editText2);
        String items = theitems.getText().toString();
        String description=thedescription.getText().toString();
        long success = db.insertRecord(items, description);
        if (success != -1)
            Toast.makeText(getApplicationContext(), "Inserted",Toast.LENGTH_LONG).show();
    }

}

数据库文件

public class Database {

    DatabaseHelper dbHelper;

    public Database(Context context){
        dbHelper = new DatabaseHelper(context, DatabaseHelper.DB_NAME, null, DatabaseHelper.DB_VERSION);
    }

    public long insertRecord(String items, String description) {
        SQLiteDatabase db=dbHelper.getWritableDatabase();
        ContentValues initialValues = new ContentValues();
        initialValues.put(DatabaseHelper.KEY_ITEMS, items);
        initialValues.put(DatabaseHelper.KEY_DESCRIPTION, description);
        long id= db.insert(DatabaseHelper.DB_TABLE, null, initialValues);
        return id;
    }

    public class DatabaseHelper extends SQLiteOpenHelper {
        public DatabaseHelper(Context context, String name, CursorFactory factory, int version) {
            super(context, name, factory, version);
            // TODO Auto-generated constructor stub
        }

        public static final String KEY_ROWID = "id";
        public static final String KEY_ITEMS = "items";
        public static final String KEY_DESCRIPTION = "description";
        public static final String DB_NAME = "shop";
        public static final String DB_TABLE = "shop_record";

        public static final int DB_VERSION = 2;

        public static final String DB_CREATE = "create table if not exists shop_record ("
                + "ID int not null auto_increment,"
                + "items varchar(255),"
                + "description varchar(255),"
                + "date datetime,"
                + "send_status char(10)," + "primary key (ID));";

        @Override
        public void onCreate(SQLiteDatabase db) {
            try {
                db.execSQL(DB_CREATE);
            } catch (android.database.SQLException e) {
                e.printStackTrace();
            }

        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub

        }

    }
}

logcat:

02-24 00:07:26.908: D/OpenGLRenderer(16859): Render dirty regions requested: true
02-24 00:07:26.918: D/Atlas(16859): Validating map...
02-24 00:07:26.947: I/Adreno-EGL(16859): <qeglDrvAPI_eglInitialize:410>: QUALCOMM Build: 10/28/14, c33033c, Ia6306ec328
02-24 00:07:26.948: I/OpenGLRenderer(16859): Initialized EGL, version 1.4
02-24 00:07:26.974: D/OpenGLRenderer(16859): Enabling debug mode 0
02-24 00:07:32.126: D/AndroidRuntime(16859): Shutting down VM
02-24 00:07:32.127: E/AndroidRuntime(16859): FATAL EXCEPTION: main
02-24 00:07:32.127: E/AndroidRuntime(16859): Process: com.example.mythirdapp, PID: 16859
02-24 00:07:32.127: E/AndroidRuntime(16859): java.lang.IllegalStateException: Could not execute method of the activity
02-24 00:07:32.127: E/AndroidRuntime(16859):    at android.view.View$1.onClick(View.java:4007)
02-24 00:07:32.127: E/AndroidRuntime(16859):    at android.view.View.performClick(View.java:4756)
02-24 00:07:32.127: E/AndroidRuntime(16859):    at android.view.View$PerformClick.run(View.java:19749)
02-24 00:07:32.127: E/AndroidRuntime(16859):    at android.os.Handler.handleCallback(Handler.java:739)
02-24 00:07:32.127: E/AndroidRuntime(16859):    at android.os.Handler.dispatchMessage(Handler.java:95)
02-24 00:07:32.127: E/AndroidRuntime(16859):    at android.os.Looper.loop(Looper.java:135)
02-24 00:07:32.127: E/AndroidRuntime(16859):    at android.app.ActivityThread.main(ActivityThread.java:5221)
02-24 00:07:32.127: E/AndroidRuntime(16859):    at java.lang.reflect.Method.invoke(Native Method)
02-24 00:07:32.127: E/AndroidRuntime(16859):    at java.lang.reflect.Method.invoke(Method.java:372)
02-24 00:07:32.127: E/AndroidRuntime(16859):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
02-24 00:07:32.127: E/AndroidRuntime(16859):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
02-24 00:07:32.127: E/AndroidRuntime(16859): Caused by: java.lang.reflect.InvocationTargetException
02-24 00:07:32.127: E/AndroidRuntime(16859):    at java.lang.reflect.Method.invoke(Native Method)
02-24 00:07:32.127: E/AndroidRuntime(16859):    at java.lang.reflect.Method.invoke(Method.java:372)
02-24 00:07:32.127: E/AndroidRuntime(16859):    at android.view.View$1.onClick(View.java:4002)
02-24 00:07:32.127: E/AndroidRuntime(16859):    ... 10 more
02-24 00:07:32.127: E/AndroidRuntime(16859): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'long com.example.edit.Database.insertRecord(java.lang.String, java.lang.String)' on a null object reference
02-24 00:07:32.127: E/AndroidRuntime(16859):    at com.example.edit.CreateActivity.save(CreateActivity.java:62)
02-24 00:07:32.127: E/AndroidRuntime(16859):    ... 13 more
02-24 00:07:34.147: I/Process(16859): Sending signal. PID: 16859 SIG: 9
02-24 00:07:34.621: D/OpenGLRenderer(16947): Render dirty regions requested: true
02-24 00:07:34.629: D/Atlas(16947): Validating map...
02-24 00:07:34.663: I/Adreno-EGL(16947): <qeglDrvAPI_eglInitialize:410>: QUALCOMM Build: 10/28/14, c33033c, Ia6306ec328
02-24 00:07:34.664: I/OpenGLRenderer(16947): Initialized EGL, version 1.4
02-24 00:07:34.685: D/OpenGLRenderer(16947): Enabling debug mode 0

3 个答案:

答案 0 :(得分:3)

你得到了NPE,因为你的db=null

long success = db.insertRecord(items, description);

所以initialized之前使用

db=new Database(CreateActivity.this);

答案 1 :(得分:2)

  

NullPointerException:尝试调用虚拟方法&#39; long   com.example.edit.Database.insertRecord

由于db的{​​{1}}对象为Database

在用于调用null class:

中的任何方法之前初始化db对象
Database

答案 2 :(得分:1)

Database db;

这意味着dbnull。尚未初始化

试试这个:

db = new Database(getApplciationContext());