0

以下の私のコードはこの警告を示しています:

ヌルポインターアクセス:変数civsは、この場所でのみヌルにすることができます

public static List<String> getCivs(String game) {
    List<String> civs = null;
    System.err.printf("game: %s\n", game);

    SQLiteDatabase db = godSimDBOpenHelper.getReadableDatabase();
    String where = GAME_COLUMN + "= ?";
    Cursor cursor = db.query(GAMES_TABLE, new String[] {CIV_COLUMN}, where, new String[] {game}, null, null, null);

    while (cursor.moveToNext()) {
        System.err.println("now here");
        System.err.println(cursor.getString(0));
        civs.add(cursor.getString(0));  //warning appears for this line
    }

    return civs;
}

案の定、これを実行するとクラッシュします。定義上、これがnullでなければならない理由がわかりません。変数をnullに初期化していることに気付きましたが(Eclipseがそうでない場合は別のエラーが発生するため、これを行うだけです)、whileループ内のリストに値を追加しています。それはもはやnullではないという意味ではありませんか?

密集していると申し訳ありませんが、ここでは何が悪いのかわかりません。多分私がvarialbleを初期化している方法で。よくわかりません。

ありがとう!

4

2 に答える 2

1

失敗する理由は、変数civsnulladdメソッドを実行しようとしたときのものであるためです。したがって、実際には、存在しないクラスインスタンスを参照しようとしています(リストインターフェイスを実装するクラスのクラスインスタンスを指すことができる変数が作成されるだけです)。

したがって、これを機能させるには、この変数(現在は何も指していない)が何か意味のあるものを指すようにする必要があります。この場合、リストインターフェイスを実装するクラスの新しいインスタンスを作成し、そのインスタンスを指すように変数を設定する必要があることを意味します。

次を試してください

public static List<String> getCivs(String game) {

    // here, you are now creating a new instance of the class ArrayList and 
    // setting civs to point at this instance.
    List<String> civs = new ArrayList<String>(); 

    System.err.printf("game: %s\n", game);

    SQLiteDatabase db = godSimDBOpenHelper.getReadableDatabase();
    String where = GAME_COLUMN + "= ?";
    Cursor cursor = db.query(GAMES_TABLE, new String[] {CIV_COLUMN}, where, new String[] {game}, null, null, null);

    while (cursor.moveToNext()) {
        System.err.println("now here");
        System.err.println(cursor.getString(0));
        civs.add(cursor.getString(0));  //warning appears for this line
    }

    return civs;
}

ちょっとしたヒントですが、これはかなり予備的なものです。少し時間をかけてOracleのコアJavaトレイルを読んでいれば、多くのフラストレーションを感じることができます。

http://docs.oracle.com/javase/tutorial/

于 2012-12-07T17:09:44.707 に答える
1

オブジェクトに物事を追加しようとしていnullます。あなたのcivsリストは存在しません。あなたはそれを作成していません。

代わりにこれを試してください:

List<String> civs = new ArrayList<String>();
于 2012-12-07T17:10:08.827 に答える