在使用JSON数据时,如何防止我的应用程序意外崩溃,“关闭”,而代之以处理异常?

问题描述

这将修复您的代码:

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

现在您有了一个空的JSONArray,稍后您将可以在程序中测试空的JSONObjects。如果找到一个,许多JSON方法都会返回JSONObject;如果不存在,则返回null。

您可能还想使用 无参数 JSON构造函数初始化JSONObject ,而不是简单地将其设置为null。当将其传递给其他JSON方法时(例如在构造函数中将其用于JSONArray()时,它将避免出现问题):

JSONObject json_data = new JSONObject();

最后,如果仍然得到JSONExceptions,那是因为您实际上没有将有效的JSON字符串传递给构造函数。您可以result在日志中打印出的值:

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

您可能会看到一些SQL错误文本,或者如果您从Web服务器中检索到HTTP错误代码(如果您的网址不正确,则会显示404错误代码)。

如果您的结果 看起来 像JSON,那么您可以使用JSONLint验证器验证它是否实际上是有效的JSON 。它将帮助您捕获可能存在的任何错误,尤其是如果您自己格式化JSON时。

解决方法

在我的应用程序中,我有一个食物活动,用户在其中输入食物,该应用程序通过用户输入的名称从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()); 
        }   
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...