В моем приложении у меня есть пищевая деятельность, в которой пользователь вводит свою пищу, и приложение запрашивает пищу по имени, введенному пользователем, из базы данных MYSQL. В случае, если введенная пища не существует, строка, возвращаемая базой данных, должна быть нулевой.
В настоящее время, когда это происходит, возникает исключение, поскольку нулевое значение не может быть проанализировано в массиве 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, если он не существует.
Вы также можете инициализировать JSONObject конструктором JSON без аргументов, а не просто устанавливать его в null. Это позволит избежать проблем при передаче его другим методам JSON (например, использовать его в конструкторе для JSONArray():
JSONObject json_data = new JSONObject();
Наконец, если вы все еще получаете JSONException
s, это потому, что вы фактически не передаете действительную строку JSON для конструктора. Вы можете распечатать значение result
в журнале:
Log.d("JSON Data", result);
Вы можете увидеть текст ошибки SQL или получить с веб-сервера, тогда код ошибки HTTP (404 является обычным явлением, если у вас нет правильного URL-адреса).
Если ваш результат выглядит как JSON, вы можете проверить, действительно ли он действует JSON или нет, с помощью JSONLint validator. Это поможет вам поймать любые ошибки, которые могут возникнуть, особенно если вы сами форматируете JSON.
Вы хотите захватить Exception и зарегистрировать его (удаленно), чтобы помочь в сбое отчетов и отладки? Я использовал этот пакет для удаленного захвата Исключений, и он работает очень хорошо: