我正在尝试通过按钮的 onClickListener 启动活动,但总是出现 Null 指针异常。我已经搜索并尝试了很多不同的东西,但我找不到我犯了错误的地方。这是相关的代码/类
崩溃活动:
public class DisplayData extends Activity{
TextView displayData;
DataObjectsProvider provider;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.displaydb);
provider = new DataObjectsProvider(this);
displayData = (TextView) findViewById(R.id.tvDisplayData);
displayData.setText(provider.getAlldobjects().toString());
}
}
(我试过推荐提供者和 setText 代码)
来自工作主要活动的 onClickListener:
bDisplay.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(MainActivity.this, DisplayData.class);
startActivity(intent);
}
});
这是崩溃活动的布局:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scrollView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:id="@+id/tvDisplayData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="showData"
android:textAppearance="?android:attr/textAppearanceMedium" />
</ScrollView>
(我已经尝试过,只有线性布局和文本视图)
这是Android清单代码:
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".DisplayData"
android:label="" >
</activity>
难道我做错了什么?是否有任何我看不到的错误或我遗漏了什么?
编辑: 日志:
02-09 23:52:35.002: W/dalvikvm(24849): threadid=1: 线程退出未捕获异常 (group=0x40c971f8) 02-09 23:52:35.052: E/AndroidRuntime(24849): 致命异常: main 02-09 23:52:35.052: E/AndroidRuntime(24849): java.lang.RuntimeException: 无法启动活动 ComponentInfo{com.d69.dancesongsdb/com.d69.dancesongsdb.DisplayData}: java.lang.NullPointerException 02- 09 23:52:35.052: E/AndroidRuntime(24849): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 02-09 23:52:35.052: E/AndroidRuntime(24849): 在 android.app。 ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 02-09 23:52:35.052: E/AndroidRuntime(24849): 在 android.app.ActivityThread.access$600(ActivityThread.java:123) 02-09 23:52:35.052 : E/AndroidRuntime(24849): 在 android.app.ActivityThread$H。handleMessage(ActivityThread.java:1147) 02-09 23:52:35.052: E/AndroidRuntime(24849): 在 android.os.Handler.dispatchMessage(Handler.java:99) 02-09 23:52:35.052: E/ AndroidRuntime(24849): 在 android.os.Looper.loop(Looper.java:137) 02-09 23:52:35.052: E/AndroidRuntime(24849): 在 android.app.ActivityThread.main(ActivityThread.java:4424 ) 02-09 23:52:35.052: E/AndroidRuntime(24849): at java.lang.reflect.Method.invokeNative(Native Method) 02-09 23:52:35.052: E/AndroidRuntime(24849): at java. lang.reflect.Method.invoke(Method.java:511) 02-09 23:52:35.052: E/AndroidRuntime(24849): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787 ) 02-09 23:52:35.052: E/AndroidRuntime(24849): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554) 02-09 23:52:35.052: E/AndroidRuntime(24849 ):在 dalvik.system.NativeStart.main(Native Method) 02-09 23:52:35.052: E/AndroidRuntime(24849): 由: java.lang.NullPointerException 02-09 23:52:35.052: E/AndroidRuntime(24849) ): 在 com.d69.dancesongsdb.DataObjectsProvider.getAlldobjects(DataObjectsProvider.java:58) 02-09 23:52:35.052: E/AndroidRuntime(24849): 在 com.d69.dancesongsdb.DisplayData.onCreate(DisplayData.java: 19) 02-09 23:52:35.052: E/AndroidRuntime(24849): 在 android.app.Activity.performCreate(Activity.java:4465) 02-09 23:52:35.052: E/AndroidRuntime(24849): 在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 02-09 23:52:35.052: E/AndroidRuntime(24849): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 02-09 23: 52:35.052: E/AndroidRuntime(24849): ... 11 更多主要(本机方法)02-09 23:52:35.052:E/AndroidRuntime(24849):由:java.lang.NullPointerException 02-09 23:52:35.052:E/AndroidRuntime(24849):在 com.d69。 dancesongsdb.DataObjectsProvider.getAlldobjects(DataObjectsProvider.java:58) 02-09 23:52:35.052: E/AndroidRuntime(24849): at com.d69.dancesongsdb.DisplayData.onCreate(DisplayData.java:19) 02-09 23: 52:35.052: E/AndroidRuntime(24849): 在 android.app.Activity.performCreate(Activity.java:4465) 02-09 23:52:35.052: E/AndroidRuntime(24849): 在 android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1049) 02-09 23:52:35.052: E/AndroidRuntime(24849): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 02-09 23:52:35.052: E/AndroidRuntime (24849): ... 11 更多主要(本机方法)02-09 23:52:35.052:E/AndroidRuntime(24849):由:java.lang.NullPointerException 02-09 23:52:35.052:E/AndroidRuntime(24849):在 com.d69。 dancesongsdb.DataObjectsProvider.getAlldobjects(DataObjectsProvider.java:58) 02-09 23:52:35.052: E/AndroidRuntime(24849): at com.d69.dancesongsdb.DisplayData.onCreate(DisplayData.java:19) 02-09 23: 52:35.052: E/AndroidRuntime(24849): 在 android.app.Activity.performCreate(Activity.java:4465) 02-09 23:52:35.052: E/AndroidRuntime(24849): 在 android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1049) 02-09 23:52:35.052: E/AndroidRuntime(24849): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 02-09 23:52:35.052: E/AndroidRuntime (24849): ... 11 更多lang.NullPointerException 02-09 23:52:35.052: E/AndroidRuntime(24849): 在 com.d69.dancesongsdb.DataObjectsProvider.getAlldobjects(DataObjectsProvider.java:58) 02-09 23:52:35.052: E/AndroidRuntime(24849 ): 在 com.d69.dancesongsdb.DisplayData.onCreate(DisplayData.java:19) 02-09 23:52:35.052: E/AndroidRuntime(24849): 在 android.app.Activity.performCreate(Activity.java:4465) 02-09 23:52:35.052: E/AndroidRuntime(24849): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 02-09 23:52:35.052: E/AndroidRuntime(24849): 在 android. app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 02-09 23:52:35.052: E/AndroidRuntime(24849): ... 11 更多lang.NullPointerException 02-09 23:52:35.052: E/AndroidRuntime(24849): 在 com.d69.dancesongsdb.DataObjectsProvider.getAlldobjects(DataObjectsProvider.java:58) 02-09 23:52:35.052: E/AndroidRuntime(24849 ): 在 com.d69.dancesongsdb.DisplayData.onCreate(DisplayData.java:19) 02-09 23:52:35.052: E/AndroidRuntime(24849): 在 android.app.Activity.performCreate(Activity.java:4465) 02-09 23:52:35.052: E/AndroidRuntime(24849): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 02-09 23:52:35.052: E/AndroidRuntime(24849): 在 android. app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 02-09 23:52:35.052: E/AndroidRuntime(24849): ... 11 更多java:58) 02-09 23:52:35.052: E/AndroidRuntime(24849): 在 com.d69.dancesongsdb.DisplayData.onCreate(DisplayData.java:19) 02-09 23:52:35.052: E/AndroidRuntime( 24849): 在 android.app.Activity.performCreate(Activity.java:4465) 02-09 23:52:35.052: E/AndroidRuntime(24849): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 02 -09 23:52:35.052: E/AndroidRuntime(24849): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 02-09 23:52:35.052: E/AndroidRuntime(24849): ... 11更多的java:58) 02-09 23:52:35.052: E/AndroidRuntime(24849): 在 com.d69.dancesongsdb.DisplayData.onCreate(DisplayData.java:19) 02-09 23:52:35.052: E/AndroidRuntime( 24849): 在 android.app.Activity.performCreate(Activity.java:4465) 02-09 23:52:35.052: E/AndroidRuntime(24849): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 02 -09 23:52:35.052: E/AndroidRuntime(24849): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 02-09 23:52:35.052: E/AndroidRuntime(24849): ... 11更多的Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 02-09 23:52:35.052: E/AndroidRuntime(24849): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 02-09 23:52:35.052: E/AndroidRuntime(24849): ... 11 更多Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 02-09 23:52:35.052: E/AndroidRuntime(24849): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 02-09 23:52:35.052: E/AndroidRuntime(24849): ... 11 更多
EDIT2 我已经放弃了 db4o 并用 sqlite 重新创建了我的类。但是这个错误仍然发生在活动上。我也编辑了崩溃活动的代码。最新行(使用提供程序)是导致崩溃的行。我已经通过更改使用以下代码启动活动的按钮的代码在主要活动上对其进行了测试:
public void onClick(View v) {
Toast.makeText(MainActivity.this, provider.getAlldobjects().toString(), Toast.LENGTH_LONG).show();
并且数据库的项目在 toast 上显示正确。在主要活动上(来自上面的代码),我已经用与崩溃活动完全相同的方式声明了 DataObjectsProvider 类。我无法理解为什么一项活动有效,而另一项活动无效。
数据对象提供者:
public class DataObjectsProvider {
// Database fields
private SQLiteDatabase database;
private DbHelper dbHelper;
private String[] allColumns = { DbHelper.COLUMN_ID,
DbHelper.COLUMN_SONGNAME, DbHelper.COLUMN_SONGARTIST, DbHelper.COLUMN_SONGGENRE };
public DataObjectsProvider (Context context) {
dbHelper = new DbHelper(context);
}
public void open() throws SQLException {
database = dbHelper.getWritableDatabase();
}
public void close() {
dbHelper.close();
}
public DataObjects createDataObjects (String songName, String songArtist, String songGenre){
ContentValues values = new ContentValues();
values.put(DbHelper.COLUMN_SONGNAME, songName + ", ");
values.put(DbHelper.COLUMN_SONGARTIST, songArtist + ", ");
values.put(DbHelper.COLUMN_SONGGENRE, songGenre);
long insertId = database.insert(DbHelper.TABLE_SONGS, null,
values);
Cursor cursor = database.query(DbHelper.TABLE_SONGS,
allColumns, DbHelper.COLUMN_ID + " = " + insertId, null,
null, null, null);
cursor.moveToFirst();
DataObjects newDobject = cursorToDataObjects(cursor);
cursor.close();
return newDobject;
}
public void deleteDobjects(DataObjects dobjects) {
long id = dobjects.getId();
System.out.println("Comment deleted with id: " + id);
database.delete(DbHelper.TABLE_SONGS, DbHelper.COLUMN_ID
+ " = " + id, null);
}
public List<DataObjects> getAlldobjects() {
List<DataObjects> dobjects = new ArrayList<DataObjects>();
Cursor cursor = database.query(DbHelper.TABLE_SONGS,
allColumns, null, null, null, null, null);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
DataObjects dobject = cursorToDataObjects(cursor);
dobjects.add(dobject);
cursor.moveToNext();
}
// Make sure to close the cursor
cursor.close();
return dobjects;
}
private DataObjects cursorToDataObjects(Cursor cursor) {
DataObjects dobject = new DataObjects();
dobject.setId(cursor.getLong(0));
dobject.setSongName(cursor.getString(1));
dobject.setSongArtist(cursor.getString(2));
dobject.setSongGenre(cursor.getString(3));
return dobject;
}
}