问题描述
这将修复您的代码:
jArray = (result == null) ? new JSONArray() : new JSONArray(result);
现在您有了一个空的JSONArray,稍后您将可以在程序中测试空的JSONObjects。如果找到一个,许多JSON方法都会返回JSONObject;如果不存在,则返回null。
您可能还想使用 无参数 JSON构造函数初始化JSONObject ,而不是简单地将其设置为null。当将其传递给其他JSON方法时(例如在构造函数中将其用于JSONArray()时,它将避免出现问题):
JSONObject json_data = new JSONObject();
最后,如果仍然得到JSONException
s,那是因为您实际上没有将有效的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());
}
}
}