点击Android的空指针异常(按钮保存到SQLite数据库)

点击Android的空指针异常(按钮保存到SQLite数据库),android,sqlite,onclick,nullpointerexception,Android,Sqlite,Onclick,Nullpointerexception,我得到一个空指针异常,当我单击确认按钮将配置文件详细信息保存到sqlite数据库时,我的应用程序关闭。我有一份基本编码结构相同(明显不同的列名等)且运行良好的阅读日志。我就是不知道怎么了。它说错误出现在ProfileDetailActivity文件的第90行,但我看不出Logdetail活动中几乎完全相同的结构是如何完美工作的!!!!任何帮助都将不胜感激,因为我马上就要发疯了 谢谢 ProfileDetailActivity import java.text.DateFormat; import

我得到一个空指针异常,当我单击确认按钮将配置文件详细信息保存到sqlite数据库时,我的应用程序关闭。我有一份基本编码结构相同(明显不同的列名等)且运行良好的阅读日志。我就是不知道怎么了。它说错误出现在ProfileDetailActivity文件的第90行,但我看不出Logdetail活动中几乎完全相同的结构是如何完美工作的!!!!任何帮助都将不胜感激,因为我马上就要发疯了

谢谢

ProfileDetailActivity

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import michelle.glucose.contentprovider.MyLogContentProvider;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;


   /*
    * TodoDetailActivity allows to enter a new todo item 
    * or to change an existing
    */
public class ProfileDetailActivity extends Activity  {
private EditText sms;
private EditText email ;
private EditText  name;
private EditText  DOB;
public  TextView textView1;
public  TextView  textView2 ;
private Spinner type;
private Spinner units;
private Spinner Gender;

private EditText max;
private EditText min;


  private Uri progUri;
  @Override
    protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.pro_pref);


textView1 = (TextView) findViewById(R.id.textView1);
textView2 = (TextView) findViewById(R.id.textView2);

type = (Spinner) findViewById(R.id.type);
units = (Spinner) findViewById(R.id.units);
Gender = (Spinner) findViewById(R.id.Gender);
max = (EditText) findViewById(R.id.max);
min = (EditText) findViewById(R.id.min);
sms = (EditText) findViewById(R.id.sms);
email = (EditText) findViewById(R.id.Email);
DOB = (EditText) findViewById(R.id.dob);
name = (EditText) findViewById(R.id.name);



Button confirmButton = (Button) findViewById(R.id.Confirm);

Bundle extras = getIntent().getExtras();

// Check from the saved Instance
progUri = (bundle == null) ? null : (Uri) bundle
    .getParcelable(MyLogContentProvider.CONTENT_ITEM_TYPE);

// Or passed from the other activity
if (extras != null) {
  progUri = extras
      .getParcelable(MyLogContentProvider.CONTENT_ITEM_TYPE);

  fillData(progUri);
}

confirmButton.setOnClickListener(new View.OnClickListener() {
  public void onClick(View view) {
    if (TextUtils.isEmpty(DOB.getText().toString())) { SAYS ERROR HERE???
      makeToast();
    } else {
      setResult(RESULT_OK);
      finish();
    }
  }

   });


   }

  public void fillData(Uri uri) {
    String[] projection =              {ProTable.COLUMN_NAME,ProTable.COLUMN_DOB,
   ProTable.COLUMN_GENDER,ProTable.COLUMN_UNIT,                   ProTable.COLUMN_MIN,ProTable.COLUMN_MAX,                                         
            ProTable.COLUMN_TYPE, ProTable.COLUMN_EMAIL,ProTable.COLUMN_NUMBER,
        ProTable.COLUMN_ID };
Cursor cursor = getContentResolver().query(uri, projection, null, null,
    null);
if (cursor != null) {
  cursor.moveToFirst();
  String idstr = cursor.getString(cursor.getColumnIndexOrThrow(ProTable.COLUMN_ID));

  String u = cursor.getString(cursor
      .getColumnIndexOrThrow(ProTable.COLUMN_UNIT));

  for (int i = 0; i < units.getCount(); i++) {

    String s = (String) units.getItemAtPosition(i);
    if (s.equalsIgnoreCase(u))
      units.setSelection(i);
    }


String g = cursor.getString(cursor.getColumnIndexOrThrow(ProTable.COLUMN_GENDER));
  for (int i = 0; i < Gender.getCount(); i++) {

    String s = (String) Gender.getItemAtPosition(i);
    if (s.equalsIgnoreCase(g)) {
      Gender.setSelection(i);
    }
  }



  String t = cursor.getString(cursor.getColumnIndexOrThrow(ProTable.COLUMN_TYPE));
  for (int i = 0; i < type.getCount(); i++) {

    String s = (String) type.getItemAtPosition(i);
    if (s.equalsIgnoreCase(t)) {
      type.setSelection(i);
    }
  }  


  name.setText(cursor.getString(cursor
      .getColumnIndexOrThrow(ProTable.COLUMN_NAME)));
  DOB.setText(cursor.getString(cursor
      .getColumnIndexOrThrow(ProTable.COLUMN_DOB)));
  min.setText(cursor.getString(cursor
          .getColumnIndexOrThrow(ProTable.COLUMN_MIN)));
      max.setText(cursor.getString(cursor
          .getColumnIndexOrThrow(ProTable.COLUMN_MAX)));
      email.setText(cursor.getString(cursor
              .getColumnIndexOrThrow(ProTable.COLUMN_EMAIL)));
          sms.setText(cursor.getString(cursor
              .getColumnIndexOrThrow(ProTable.COLUMN_NUMBER)));

  // Always close the cursor
  cursor.close();}
}


   protected void onSaveInstanceState(Bundle outState) {
   super.onSaveInstanceState(outState);
   saveState();
    outState.putParcelable(MyLogContentProvider.CONTENT_ITEM_TYPE, progUri);
    }

       @Override
   protected void onPause() {
      super.onPause();
saveState();
     }

     private void saveState() {



  String t = (String) type.getSelectedItem();
  String u = (String) units.getSelectedItem();
String g = (String) Gender.getSelectedItem();
String n = name.getText().toString();
String d = DOB.getText().toString();
String mi = min.getText().toString();
String ma = max.getText().toString();
String e = email.getText().toString();
String s = sms.getText().toString();
// Only save if either summary or description
// is available

if (d.length() ==0) {
  return;
}


ContentValues values = new ContentValues();

values.put(ProTable.COLUMN_NAME, n);
values.put(ProTable.COLUMN_DOB, d);
values.put(ProTable.COLUMN_GENDER, g);
values.put(ProTable.COLUMN_UNIT, u);
values.put(ProTable.COLUMN_TYPE, t);
values.put(ProTable.COLUMN_MIN, mi);
values.put(ProTable.COLUMN_MAX, ma);
values.put(ProTable.COLUMN_EMAIL, e);
values.put(ProTable.COLUMN_NUMBER, s);
if (progUri == null) {
  // New log
  progUri = getContentResolver().insert(MyLogContentProvider.CONTENT_URI, values);
} else {
  // Update log
  getContentResolver().update(progUri, values, null, null);
}
  }

 private void makeToast() {
Toast.makeText(ProfileDetailActivity.this, "Please maintain a glucose log",
    Toast.LENGTH_LONG).show();
  }
数据库助手类

   import android.content.Context;
   import android.database.sqlite.SQLiteDatabase;
   import android.database.sqlite.SQLiteDatabase.CursorFactory;
   import android.database.sqlite.SQLiteOpenHelper;

   public class ProfileDatabaseHelper extends SQLiteOpenHelper {

     private static final String DATABASE_NAME = "protable.db";
    private static final int DATABASE_VERSION = 1;

   public ProfileDatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
      }

    public ProfileDatabaseHelper(Context context, String databaseName,
      CursorFactory factory, int databaseVersion) {
  super(context, databaseName , factory, databaseVersion);
      }

     public ProfileDatabaseHelper(Context context, String databaseName,
    Object factory, int databaseVersion) {
super(context, DATABASE_NAME, null,  DATABASE_VERSION);
      }

     // Method is called during creation of the database
      @Override
     public void onCreate(SQLiteDatabase database) {
       ProTable.onCreate(database);
      }

    // Method is called during an upgrade of the database,
    // e.g. if you increase the database version
     @Override
   public void onUpgrade(SQLiteDatabase database, int oldVersion,
     int newVersion) {
    ProTable.onUpgrade(database, oldVersion, newVersion);
    }
   } 
LOGCAT

 E/AndroidRuntime(3797):FATAL EXCEPTION: main
 E/AndroidRuntime(3797): java.lang.NullPointerException
  E/AndroidRuntime(3797):at                       michelle.glucose.ProfileDetailActivity$1.onClick(ProfileDetailActivity.java:90)
        E/AndroidRuntime(3797):at android.view.View.performClick(View.java:4204)
 E/AndroidRuntime(3797):at android.view.View$PerformClick.run(View.java:17355)
 E/AndroidRuntime(3797):at android.os.Handler.handleCallback(Handler.java:725)
 E/AndroidRuntime(3797): at android.os.Handler.dispatchMessage(Handler.java:92)
 E/AndroidRuntime(3797): at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(3797): at android.app.ActivityThread.main(ActivityThread.java:5041)
 E/AndroidRuntime(3797): at java.lang.reflect.Method.invokeNative(Native Method)
 E/AndroidRuntime(3797): at java.lang.reflect.Method.invoke(Method.java:511)
 E/AndroidRuntime(3797): at
 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
E/AndroidRuntime(3797): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
E/AndroidRuntime(3797): at dalvik.system.NativeStart.main(Native Method)

老实说,nullpointerexception是需要解决的最简单的bug之一,而且它几乎总是您自己代码中的bug。转到引发nullpointerexception的代码行,思考是什么导致了这种情况。我不知道源代码中的第90行是什么,但例如,如果是以下代码行:

DOB.getText().toString()

然后DOB为null,或者DOB.getText()为null。如果您无法计算出哪一行代码,则在该行代码之前打印出值。然后考虑是什么导致空指针,或者通过代码回溯到DOB(未)初始化或其“text”属性(未)设置的位置。

谢谢!通过更改我正在检查的列对其进行排序不幸的是,现在活动无法暂停,因为我的其他日志读取类(其代码实际上与此类相同)也在工作。我想我是在做一些愚蠢的事情之后,从日志数据库类复制/粘贴到概要数据库类!祝你好运在这里发布一个引起问题的最小代码示例,有人可以提供帮助。此外,如果您发现答案有用,请确保将其标记为有用(单击向上箭头),或者如果它解决了您的问题,请将其标记为解决方案(单击复选标记)。谢谢!以下是导致On pause/saveState出现问题的代码行。private void saveState(){String d=DOB.getText().toString();…}我想我只需要从头开始,通过这种方式来了解到底是什么我做错了,当我看到它时,我可能会踢自己一下!:)
 E/AndroidRuntime(3797):FATAL EXCEPTION: main
 E/AndroidRuntime(3797): java.lang.NullPointerException
  E/AndroidRuntime(3797):at                       michelle.glucose.ProfileDetailActivity$1.onClick(ProfileDetailActivity.java:90)
        E/AndroidRuntime(3797):at android.view.View.performClick(View.java:4204)
 E/AndroidRuntime(3797):at android.view.View$PerformClick.run(View.java:17355)
 E/AndroidRuntime(3797):at android.os.Handler.handleCallback(Handler.java:725)
 E/AndroidRuntime(3797): at android.os.Handler.dispatchMessage(Handler.java:92)
 E/AndroidRuntime(3797): at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(3797): at android.app.ActivityThread.main(ActivityThread.java:5041)
 E/AndroidRuntime(3797): at java.lang.reflect.Method.invokeNative(Native Method)
 E/AndroidRuntime(3797): at java.lang.reflect.Method.invoke(Method.java:511)
 E/AndroidRuntime(3797): at
 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
E/AndroidRuntime(3797): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
E/AndroidRuntime(3797): at dalvik.system.NativeStart.main(Native Method)
DOB.getText().toString()