我有一个班级Persona:
String name;
Int age;
我有一个ArrayList<Persona>
,然后是
我用一个for循环填充ArrayList,add(new Persona(name,age))
带有一个JSON解析数据(这个JSON解析是从一个PHP请求到一个返回随机数“Persona's”的MySQL数据库)。
当循环结束时,我想得到一个Persona,但Eclipse IDE告诉我要使用get(i)
我必须声明像final
这样的ArrayList,如果我这样做,我无法填写它。
这是代码:
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问题。答案 0 :(得分:1)
final
is not the same as C++ const
。将personas
声明为final
引用并不会阻止您更改引用所引用的对象。
答案 1 :(得分: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){}
答案 2 :(得分: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