2

サーバーと通信し、httpを使用して応答を取得する一部のアプリケーションでは、jsonを使用してデータサーバー側をフォーマットし、デバイスに到達したら、stackoverflowで見つけた次のコードに似たものを使用します。

private class LoadData extends AsyncTask<Void, Void, String> 
{ 
private  JSONArray jArray;
private  String result = null;
private  InputStream is = null;
private String entered_food_name=choice.getText().toString().trim();
protected void onPreExecute() 
{
}

@Override
protected String doInBackground(Void... params) 
{
try {
ArrayList<NameValuePair> nameValuePairs = new            ArrayList<NameValuePair>();
HttpClient httpclient = new DefaultHttpClient(); 
HttpPost httppost = new HttpPost("http://10.0.2.2/food.php");
nameValuePairs.add(new BasicNameValuePair("Name",entered_food_name));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs,"UTF-8"));
HttpResponse response = httpclient.execute(httppost);

HttpEntity entity = response.getEntity();
 is = entity.getContent();

    //convert response to string

BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf-8"),8);
    StringBuilder sb = new StringBuilder();
    String line = null;
    while ((line = reader.readLine()) != null) {
        sb.append(line);
    }

    is.close();


    result =sb.toString();
    result = result.replace('\"', '\'').trim();

}
catch(Exception e){
    Log.e("log_tag", " connection" + e.toString());                     
}


return result;  

}

@Override
protected void onPostExecute(String result) 
{  
try{

    String foodName="";
    int Description=0;

    jArray = new JSONArray(result); // here if the result is null an exeption will occur
    JSONObject json_data = null;

    for (int i = 0; i < jArray.length(); i++) {
        json_data = jArray.getJSONObject(i);
        foodName=json_data.getString("Name");
        .
        .
        .
        .
        .
    } 
    catch(JSONException e){ 
        **// what i can do here to prevent my app from crash and 
        //  make toast " the entered food isnot available " ????**
        Log.e("log_tag", "parssing  error " + e.toString()); 
    }   
}
}

このコードを見つけたページでソリューションを使用しようとしました。ちなみに、ここにリンクがあります。JSONデータを使用しているときに、アプリが予期せずクラッシュするのを防ぎ、「強制終了」して、代わりに例外を処理するにはどうすればよいですか?

オンラインバリデーターでjsonの応答を確認しようとしましたが、返されたjsonは有効です。ユーザーがカバレッジの悪いエリアにいると、接続が一時的に切断されるか、何かが原因でjsonが切断され、そのリンクに投稿したスレッドで提案された方法を試しても、json例外が発生すると思います。したがって、JSONが電話に到達したときに検証できるようにしたいので、有効な場合は続行できます。そうでない場合は、JSONを修正するか、少なくとも壊れた適切にフォーマットされていないjsonを渡そうとはしません。 JSONExceptionを引き起こすメソッドの1つに配列します。

応答で取得した文字列を検証して、その有効なJSONがすばらしいことを確認するためのヒント。

編集:問題に関連するスタックダンプを追加

org.json.JSONException: Value null at results of type org.json.JSONObject$1 cannot be     converted to JSONArray
at org.json.JSON.typeMismatch(JSON.java:96)
at org.json.JSONObject.getJSONArray(JSONObject.java:548)
at it.cores.Activity$GetM.doInBackground(Activity.java:1159)
at it.cores.Activity$GetM.doInBackground(Activity.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:185)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1019)
4

1 に答える 1

2

文字列の結果に対して操作を行う前に、nullチェックまたは応答コードが含まれているかどうかのチェックなどの他の検証を行った後、必ず解析を行う必要があります。

protected void onPostExecute(String result) 
{  
try{

    String foodName="";
    int Description=0;

if(result!=null)//Do your validation for result

{
    jArray = new JSONArray(result); // here if the result is null an exeption will occur
    JSONObject json_data = null;

    for (int i = 0; i < jArray.length(); i++) {
        json_data = jArray.getJSONObject(i);
        foodName=json_data.getString("Name");
        .
        .
        .
        .
        .
    } 
 }
   catch(JSONException e){ 
        **// what i can do here to prevent my app from crash and 
        //  make toast " the entered food isnot available " ????**
        Log.e("log_tag", "parssing  error " + e.toString()); 
    }   
}
于 2012-06-10T01:42:10.403 に答える