在我的应用程序中,我有一个食物活动,用户在其中输入食物,该应用程序通过用户输入的名称从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()); } } }
这将修复您的代码:
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在日志中打印出的值:
JSONException
result
Log.d("JSON Data", result);
您可能会看到一些SQL错误文本,或者如果您从Web服务器中检索到HTTP错误代码(如果您的网址不正确,则会显示404错误代码)。
如果您的结果 看起来 像JSON,那么您可以使用JSONLint验证器验证它是否实际上是有效的JSON 。它将帮助您捕获可能存在的任何错误,尤其是如果您自己格式化JSON时。