0

私はクラス Persona を持っています:

String name;
Int age;

そして、私は を持っていArrayList<Persona>ます

ArrayList にadd(new Persona(name,age))、JSON 解析データを使用する for ループを入力します (この JSON 解析は、PHP リクエストから MySQL DB への "ペルソナ" の乱数を返すものです)。

ループが終了したら、このペルソナの 1 つを取得したいのですが、Eclipse IDE は、使用するget(i)には ArrayList を のように宣言するfinal必要があると私に言いました。

これはコードです:

ArrayList<Persona> personas = new ArrayList<Persona>();
JSONParser jParser = new JSONParser();
JSONObject json = jParser.getJSONFromUrl(url);

try {
    personas = json.getJSONArray(TAG);
    for(int i = 0; i < putas.length(); i++) {
        JSONObject c = personas.getJSONObject(i);
        String name = c.getString(TAG_NAME);
        Int age = c.getString(TAG_AGE);
        personas.add(new Persona(name, age));
} catch (...) {
    ...
}

int i = 4;
Persona p = personas.get(i);

このコードでは、IDE はエラーを表示し、「final」修飾子を ArrayList に追加するよう「提案」しますが、それはばかげています。

PD: 問題は Android アプリケーションにありますが、Java の問題だと思います。

4

3 に答える 3

1

finalは C++ と同じではありませんconst。参照であることを宣言personasしても、final参照が参照するオブジェクトを変更できなくなるわけではありません。

于 2012-10-29T13:03:58.467 に答える
0

そこに行かない限り、コンパイルされない理由はないはずですfinal。あなたは何かを逃しているに違いありません。

いずれにせよ、finalキーワードは単に、そのフィールドに何かを割り当てることができないことを意味するだけであり、そのメソッドを呼び出せないことを意味するわけではありません。

その通りです。作成した場合personas final、そのままのコードは機能しpersonas = json.getJSONArray(TAG)ません。許可されないためです。

コンパイル時に非最終的であるという苦情が寄せられているので、この後に実際にコードがいくつかあると仮定していますpersonas。次のような内部でそれを使用しようとしている場合:

Runnable r = new Runnable() { public void run() { personas.get(0); } };

Viewリスナーか何かのためにやっているかもしれません。

それは、それを最終的にする必要があります。それに対する最も簡単な解決策は、別のローカル変数を作成し、それを最終的なものにすることです。

final ArrayList<Persona> finalPersonas = personas

于 2012-10-29T13:11:59.070 に答える
0

try ブロックで配列 List を初期化してみてください...

 ArrayList<Persona> personas;
 JSONParser jParser;
 JSONObject json;
 try
 {
   personas = new ArrayList<Persona>();
   jParser = new JSONParser();
   json = jParser.getJSONFromUrl(url);

   // rest of the code
 }
 catch(Exception e){}
于 2012-10-29T13:02:22.093 に答える