7

私はこれを2日間正しくしようとしていて、何かを投げる準備ができています.....

try/catch ブロックで処理している JSONArray がありますが、最後に変数が渡されないようです。

私のコード:

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 を使用して null かどうかを確認してください。

入れないJSONArray results = nullと、コンパイラはおそらく変数が初期化されていないことについて泣き言を言うでしょう。

さらなる説明:

これはscopeが原因で発生します。try 内で宣言すると、変数のスコープは、try が終了した時点で終了します。if 内で宣言すると、その if が終了すると、変数にアクセスできなくなります。これは、比較やコードの読みやすさの向上、メモリの再利用などのためにのみ使用する一時変数に非常に役立ちます(これが単語であってもわかります)。とにかく、クラス内のどこからでも変数にアクセスする必要がある場合は、フィールドとして宣言する方がよい場合があります。

私はこの説明を読んでいませんでしたが、良さそうです。見てください。

于 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 に答える