我一直试图让这个问题持续2天,并准备扔东西......
我有一个JSONArray,我正在try / catch块中处理,但它似乎没有在最后传递变量。
我的代码:
try{
//Get the element that holds the results ( JSONArray )
JSONArray getresults = json.getJSONArray("results");
//Loop the Array
for(int i=0;i < getresults.length();i++){
HashMap<String, String> map = new HashMap<String, String>();
JSONObject e = getresults.getJSONObject(i);
totalpass = e.getJSONObject(i).getString("ftotalpass");
}
} catch(JSONException e) {
Log.e("log_tag", "Error parsing data "+e.toString());
}
我已尝试在try / catch块之前,之后,之后声明变量的所有庄园,但我无法将其传递给我的其余代码。
我做错了什么?
答案 0 :(得分:8)
嗯...
你可以在外面宣布。如
JSONArray results = null;
try {
results = json.getJSONArray("results");
}...
这样你可以在外面访问它,但一定要使用if来查看它是否为空。
如果你没有放JSONArray results = null
,编译器可能会抱怨没有被初始化的变量。
进一步解释:
这是因为范围。当您在try中声明时,变量的范围在try结束时结束。当你在if中声明,当if结束时,不再能访问该变量。这对于临时变量非常有用,在这些变量中,您只使用它们进行比较或更好的代码可读性,内存重用等。(如果这甚至是单词,则为idk)。无论如何,如果你的变量需要在类中的任何地方访问,那么最好将其声明为一个字段。
我没看过this explanation,但看起来不错。看一看。
答案 1 :(得分:1)
在外面宣布它可以解决问题:
JSONArray getresults = null;
try{
//Get the element that holds the results ( JSONArray )
getresults = json.getJSONArray("results");
//Loop the Array
for(int i=0;i < getresults.length();i++){
HashMap<String, String> map = new HashMap<String, String>();
JSONObject e = getresults.getJSONObject(i);
totalpass = e.getJSONObject(i).getString("ftotalpass");
}
} catch(JSONException e) {
Log.e("log_tag", "Error parsing data "+e.toString());
}
答案 2 :(得分:1)
nullPointerException
。我宁愿这样做:
JSONArray results = new JSONArray();
try {
results = json.getJSONArray("results");
}...
答案 3 :(得分:0)
在块外声明您的变量并将其分配到块内:
JSONArray getresults;
try {
...
getresults = ...; // your assignment;
...
}
catch(JSONException e) {
Log.e("log_tag", "Error parsing data" + e.toString());
getresults = ...; //maybe some other assignment
}
//use variable
if(getresults ...) {
...
}