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