7

两天来我一直在努力解决这个问题,并且准备扔东西.....

我有一个 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 块之前、之中、之后声明变量的所有方法,但我就是无法让它传递给我的代码的其余部分。

我究竟做错了什么?

4

4 回答 4

9

唔...

你可以在外面声明。如

JSONArray results = null;

try {
     results = json.getJSONArray("results");
}...

这样您就可以在外部访问它,但一定要使用 if 来查看它是否为空。

如果你不把JSONArray results = null编译器可能会抱怨变量没有被初始化。

进一步说明:

发生这种情况是因为范围。当你在 try 中声明时,变量的作用域在 try 结束时结束。当您在 if 中声明时,如果该 if 结束,则无法再访问该变量。这对于临时变量非常有用,您仅将它们用于比较或更好的代码可读性、内存重用等(如果这是一个单词,idk)。无论如何,如果您的变量需要在类中的任何地方访问,最好将其声明为字段。

我没有阅读这个解释,但它似乎很好。看一看。

于 2012-07-11T13:11:12.657 回答
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());                                      
}
于 2012-07-11T13:10:52.047 回答
1

加布里埃尔描述的方式有效,但你可能会遇到nullPointerException这种方法。我宁愿这样做:

JSONArray results = new JSONArray();

try {
     results = json.getJSONArray("results");
}...
于 2012-07-11T13:14:46.217 回答
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 ...) {
    ...
}
于 2012-07-11T13:13:39.400 回答