【问题标题】:NullPointeException on StartActivity from button来自按钮的 StartActivity 上的 NullPointeException
【发布时间】:2013-02-10 06:48:29
【问题描述】:

我正在尝试通过按钮的 onClickListener 启动活动,但总是出现空指针异常。 我已经搜索并尝试了很多不同的东西,但我找不到我犯了错误的地方。 这是相关的代码/类

崩溃的活动:

    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):致命异常:主要 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): 在 java.lang.reflect.Method.invokeNative(Native Method) 02-09 23:52:35.052: E/AndroidRuntime(24849): 在 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(本机方法) 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 更多

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;
    }

}

【问题讨论】:

  • 什么是 NullPointerException?你能显示错误信息吗
  • 发布 logcat 堆栈跟踪。
  • 你没有连接你的按钮bDisplay...
  • 我已经编辑了我的帖子并添加了日志。是的,我已经连接了按钮。
  • 查看我的编辑。错误位于您的 DataObjectsProvider 的第 24 行

标签: android nullpointerexception


【解决方案1】:

如果没有堆栈跟踪,很难看出问题所在(后一篇)。

但据我所知,NPE 可能来自这两行中的任何一行:

displayData = (TextView) findViewById(R.id.tvDisplayData);      
displayData.setText(provider.list.toString());

displayData(TextView)为空,或者提供者的列表。您确定要在提供者的构造函数中创建列表吗?

编辑:

错误位于 DataObjectsProvider 的第 24 行:

"at com.d69.dancesongsdb.DataObjectsProvider.(DataObjectsProvider.java:24)"

EDIT2:

你从来没有叫过 open。因此数据库对象为空。这是你的崩溃。您还可以在移动到操作之前检查您从该查询中检索到的光标是否为空。

【讨论】:

  • 我也认为这是问题所在,但让我们等待 OP 传递他的堆栈跟踪。
  • 我得到了同样的错误,即使我推荐了所有对提供者的引用。只有布局和文本视图,没有任何其他功能。
  • 是的,你说得对。 DataObjectsProvider 导致错误。似乎当我之前尝试将其注释掉时,我也遇到了另一个错误。我只是重新测试了这个,没有它,带有 textview 的活动就可以开始了。我
  • 所以问题是如何将 db4o 查询的结果显示到 textview。我觉得我需要发布一个关于这个问题的新问题。谢谢。
  • 可能想要接受这个答案,这样它就不会一直无人回答
【解决方案2】:

最后,搜索和阅读减少了我的愚蠢。我试图在不先打开数据库的情况下进行查询。在 MainActivity 上,数据库是从另一个方法调用(用于存储项目)打开的,但在 DisplayData 活动上不是。所以需要先使用:

provider.open();

然后:

provider.getAllObjects();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 2013-02-19
    • 2018-12-06
    • 1970-01-01
    相关资源
    最近更新 更多