1

私のアプリケーションでは、ユーザーが自分の食べ物を入力するフードアクティビティがあり、アプリはユーザーが入力した名前でMYSQLデータベースから食べ物を要求します。入力された食品が存在しない場合、データベースによって返される文字列はnullである必要があります。

現在、これが発生すると、null値をJSON配列に解析できないため、例外が発生します。私の質問は、「アプリが強制終了しないようにする方法はありますか?例外を処理して、リクエストされた食べ物が見つからなかったことをユーザーに通知するトーストを表示できますか?」アプリがクラッシュするのを防ぎたいのですが、むしろ正常に失敗します。

私を助けてください。

アプリケーションに関連するコードを表示しました。

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()); 
        }   
    }
}
4

2 に答える 2

3

これにより、コードが修正されます。

jArray = (result == null) ? new JSONArray() : new JSONArray(result);

空のJSONArrayができたので、プログラムの後半でnullJSONObjectsをテストできます。JSONメソッドの多くは、JSONObjectが見つかった場合はJSONObjectを返し、存在しない場合はnullを返します。

単にnullに設定するのではなく、引数のないJSONコンストラクターを使用してJSONObjectを初期化することもできます。他のJSONメソッドに渡すときの問題を回避します(JSONArray()のコンストラクターで使用するなど)。

JSONObject json_data = new JSONObject();

最後に、まだJSONExceptionsを取得している場合は、実際に有効なJSON文字列をコンストラクターに渡していないためです。の値をresultログに出力できます。

Log.d("JSON Data", result);

SQLエラーテキストが表示される場合や、Webサーバーから取得した場合は、HTTPエラーコードが表示される場合があります(URLが正しくない場合は404が一般的です)。

結果がJSONのように見える場合は、 JSONLintバリデーターを使用して、それが実際に有効なJSONであるかどうかを確認できます。特にJSONを自分でフォーマットしている場合は、エラーが発生した場合にそれを見つけるのに役立ちます。

于 2012-05-14T16:49:57.290 に答える
0

クラッシュのレポートとデバッグを支援するために、例外をキャプチャして(リモートで)ログに記録することを検討していますか?私はこのパッケージを使用して例外をリモートでキャプチャしましたが、かなりうまく機能します。

http://code.google.com/p/android-remote-stacktrace/

于 2012-05-14T16:46:13.750 に答える