1

在我的应用程序中,我有一个食物活动,用户在其中输入他/她的食物,应用程序以用户输入的名称从 MYSQL 数据库请求食物。在输入的食物不存在的情况下,数据库返回的字符串应该为空。

目前,当发生这种情况时,会发生异常,因为 null 值无法解析为 JSON 数组。我的问题是:“有没有办法阻止我的应用程序强制关闭?我可以处理异常并显示一个 toast 通知用户未找到请求的食物吗?” 我想防止应用程序崩溃,而是优雅地失败。

请帮我。

我已经在我的应用程序中显示了相关代码..

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,您可以稍后在程序中测试 null JSONObjects。如果找到一个 JSONObject,则许多 JSON 方法返回一个 JSONObject,如果不存在则返回 null。

您可能还想使用无参数JSON 构造函数初始化 JSONObject,而不是简单地将其设置为 null。将它传递给其他 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 回答