2015-02-24 44 views
0

我似乎无法弄清楚如何解决NPE错误。是否因为插入时我没有包含ID列?或者是因为数据库正在返回一个不是很长(或int)的数据类型?java.lang.IllegalStateException:无法执行由调用和NPE错误引起的活动的方法

的活动:

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 

回答

2

的NullPointerException:尝试调用虚拟方法“长 com.example.edit.Database.insertRecord

由于Databasedb目的是null

初始化db使用从Database类调​​用任何方法之前对象:

db=new Database(CreateActivity.this); 
+0

这工作,谢谢。但我仍然无法理解。这是否与我用构造函数初始化它相同: 'Database db = new Database(Context context)' – user2883071 2015-02-24 05:52:01

+1

@ user2883071:如果在任何方法中使用'Database db = new Database(Context context)'行,那么确定。但没有像Database Database那样的方法;如果你将Database Database更改为'Database db = new Database(this)'会导致Context问题,因为在onStart之前没有可用的上下文,onCreate方法声明'数据库db;'在类级别上初始化它在onCreate或onStart方法中以在整个类中使用 – 2015-02-24 05:55:37

3

,因为你有你的NPE在db=null

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

所以initialized之前所使用的

db=new Database(CreateActivity.this); 
1

Database db;

这意味着dbnull。尚未初始化

试试这个:

db = new Database(getApplciationContext()); 
相关问题