0

ボタンの 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): 致命的な例外: メイン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(ネイティブ メソッド) 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): at 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 詳細main(Native Method) 02-09 23:52:35.052: E/AndroidRuntime(24849): 原因: java.lang.NullPointerException 02-09 23:52:35.052: E/AndroidRuntime(24849): at 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 件以上main(Native Method) 02-09 23:52:35.052: E/AndroidRuntime(24849): 原因: java.lang.NullPointerException 02-09 23:52:35.052: E/AndroidRuntime(24849): at 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 もっと見る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();

データベースのアイテムがトーストに正しく表示されます。メイン アクティビティ (上記のコードから) で、クラッシュ アクティビティとまったく同じ方法で DataObjectsProvider クラスを宣言しました。なぜ一方のアクティビティが機能し、もう一方のアクティビティが機能しないのか理解できません。

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

}

4

2 に答える 2

1

スタックトレースがないと、問題が何であるかを確認するのは困難です (投稿 1)。

しかし、私が見る限り、NPE は次の 2 つの行のいずれかから発生する可能性があります。

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

displayData (TextView) が null であるか、プロバイダーのリストです。プロバイダのコンストラクタでリストを作成していますか?

編集:

エラーは DataObjectsProvider の 24 行目にあります。

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

EDIT2:

あなたはオープンと呼んだことはありません。したがって、データベース オブジェクトは null です。あなたのクラッシュがあります。move to 操作を実行する前に、そのクエリから取得したカーソルが null かどうかを確認することもできます。

于 2013-02-09T14:38:06.787 に答える
0

最後に、検索して読むことで、私の愚かさが減りました。最初にデータベースを開かずにクエリを実行しようとしていました。MainActivity では、(項目を格納するために) 別のメソッド呼び出しからデータベースが開かれましたが、DisplayData アクティビティでは開かれませんでした。したがって、最初に使用する必要があります:

provider.open();

その後:

provider.getAllObjects();
于 2013-02-09T22:48:29.370 に答える