[英]NullPointerException when attempting ConcurrentHashMap.get()
[英]NullPointerException / CursorOutOfBoundsException when attempting to get data from SQLite db
[编辑] logcat已添加
按照标题。 当我尝试从数据库中恢复数据并且没有任何内容时,我曾预料会发生这种情况,因此我尝试避免这种情况。
目前,我有一个User类,它带有三个参数(String,String,int)。 在扩展SQLiteOpenHelper的类中,我还具有以下方法:
public User retrieveUserInfo() {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_USER, null);
String name = null;
String surname = null;
String age = null;
if (cursor == null) {
Log.d("NULL", "CURSOR IS NULL");
user = new User("Please connect to server", " ", 0);
}
if (cursor.moveToFirst()) {
Log.d("NOT NULL", "CURSOR IS NOT NULL");
do {
name = cursor.getString(cursor.getColumnIndex(COLUMN_NAME));
surname = cursor.getString(cursor
.getColumnIndex(COLUMN_SURNAME));
age = cursor.getString(cursor.getColumnIndex(COLUMN_AGE));
} while (cursor.moveToNext());
Log.d("NAME", name);
int age_p = Integer.parseInt(age);
user = new User(name, surname, age_p);
}
return user;
}
然后,我从另一个活动中调用此方法:
DatabaseTask dt = new DatabaseTask(this);
User user = dt.retrieveUserInfo();
String name = user.getName();
String surname = user.getSurname();
TextView textName = (TextView) findViewById(R.id.textView1);
TextView textSurname = (TextView) findViewById(R.id.textView2);
textName.setText(name);
textSurname.setText(surname);
因此,当前我正在尝试通过在游标为null时向后发送带有一些占位符字段的User实例来避免崩溃(此方法中的“ user”字段是User类型的公共静态成员变量,该变量在该类的前面定义) ),并在游标不为null时返回存储在数据库中的普通数据。 不过,它仍然不起作用:我卸载应用程序并重新安装后,该应用程序便崩溃了。 现在,如果我在数据库中插入一些东西,然后重新安装该应用程序而没有先将其删除(我想更新它并保留旧数据库),则该应用程序不会崩溃。
关于为什么我的游标检查是否为null的任何想法都行不通?
[编辑] logcat如下:
> 03-17 02:48:35.036: E/AndroidRuntime(1225): FATAL EXCEPTION: main
> 03-17 02:48:35.036: E/AndroidRuntime(1225): Process:
> com.example.jsonbourne, PID: 1225 03-17 02:48:35.036:
> E/AndroidRuntime(1225): java.lang.RuntimeException: Unable to start
> activity
> ComponentInfo{com.example.jsonbourne/com.example.jsonbourne.MainActivity}:
> java.lang.NullPointerException 03-17 02:48:35.036:
> E/AndroidRuntime(1225): at
> android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
> 03-17 02:48:35.036: E/AndroidRuntime(1225): at
> android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
> 03-17 02:48:35.036: E/AndroidRuntime(1225): at
> android.app.ActivityThread.access$800(ActivityThread.java:135) 03-17
> 02:48:35.036: E/AndroidRuntime(1225): at
> android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
> 03-17 02:48:35.036: E/AndroidRuntime(1225): at
> android.os.Handler.dispatchMessage(Handler.java:102) 03-17
> 02:48:35.036: E/AndroidRuntime(1225): at
> android.os.Looper.loop(Looper.java:136) 03-17 02:48:35.036:
> E/AndroidRuntime(1225): at
> android.app.ActivityThread.main(ActivityThread.java:5017) 03-17
> 02:48:35.036: E/AndroidRuntime(1225): at
> java.lang.reflect.Method.invokeNative(Native Method) 03-17
> 02:48:35.036: E/AndroidRuntime(1225): at
> java.lang.reflect.Method.invoke(Method.java:515) 03-17 02:48:35.036:
> E/AndroidRuntime(1225): at
> com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
> 03-17 02:48:35.036: E/AndroidRuntime(1225): at
> com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 03-17
> 02:48:35.036: E/AndroidRuntime(1225): at
> dalvik.system.NativeStart.main(Native Method) 03-17 02:48:35.036:
> E/AndroidRuntime(1225): Caused by: java.lang.NullPointerException
> 03-17 02:48:35.036: E/AndroidRuntime(1225): at
> com.example.jsonbourne.MainActivity.onCreate(MainActivity.java:31)
> 03-17 02:48:35.036: E/AndroidRuntime(1225): at
> android.app.Activity.performCreate(Activity.java:5231) 03-17
> 02:48:35.036: E/AndroidRuntime(1225): at
> android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
> 03-17 02:48:35.036: E/AndroidRuntime(1225): at
> android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
> 03-17 02:48:35.036: E/AndroidRuntime(1225): ... 11 more
[edit 2] MainActivity和activity_mail.xml如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//GetJson gj = new GetJson(this);
//gj.getData();
DatabaseTask dt = new DatabaseTask(this);
User user = dt.retrieveUserInfo(); // **<------- LINE 31**
String name = user.getName();
String surname = user.getSurname();
TextView textName = (TextView) findViewById(R.id.textView1);
TextView textSurname = (TextView) findViewById(R.id.textView2);
textName.setText(name);
textSurname.setText(surname);
Button buttonconnect = (Button) findViewById(R.id.button_connect);
activity_mail.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<Button
android:id="@+id/button_connect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="188dp"
android:background="#F0FF00"
android:text="@string/pressconnect" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/button_connect"
android:layout_alignParentTop="true"
android:layout_marginTop="100dp"
android:text="Medium Text"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/textView1"
android:layout_alignRight="@+id/button_connect"
android:layout_marginRight="17dp"
android:text="Medium Text"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView1"
android:layout_alignParentTop="true"
android:layout_marginTop="22dp"
android:text="Welcome,"
android:textAppearance="?android:attr/textAppearanceLarge" />
</RelativeLayout>
尝试:
if (cursor == null) {
Log.d("NULL", "CURSOR IS NULL");
user = new User("Please connect to server", " ", 0);
} else if (cursor.moveToFirst()) {
Log.d("NOT NULL", "CURSOR IS NOT NULL");
//...
}
代替:
if (cursor == null) {
Log.d("NULL", "CURSOR IS NULL");
user = new User("Please connect to server", " ", 0);
}
if (cursor.moveToFirst()) {
好像您忘记了else
语句
有问题的代码
DatabaseTask dt = new DatabaseTask(this);
User user = dt.retrieveUserInfo(); // **<------- LINE 31**
String name = user.getName();
不能真正产生stacktrace,因此我们假设NPE确实发生在下一行, getName()
对null
user
调用getName()
。 可以通过修复retrieveUserInfo()
来解决此问题,例如:
Cursor cursor = ...;
if (cursor.moveToFirst()) {
// create user from cursor data
} else {
// create default user
}
return user;
cursor
null
检查不是必需的,如注释中所述。
同样,您的查询从表中获取所有行,但仅使用最后一行中的数据。 稍后,您可能需要考虑优化,即仅获取您实际使用的数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.