Как предотвратить неожиданное падение моего приложения, принудительное закрытие при использовании данных JSON и обработать исключение вместо этого?

1

В моем приложении у меня есть пищевая деятельность, в которой пользователь вводит свою пищу, и приложение запрашивает пищу по имени, введенному пользователем, из базы данных 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()); 
        }   
    }
}
  • 0
    Вы пытались вставить makeToast в тот улов? Если так, что случилось?
  • 0
    Я пытался поставить тост в улове, но приложение по-прежнему аварийно завершает работу, когда результат возвращается как нулевой
Показать ещё 2 комментария
Теги:
try-catch

2 ответа

3
Лучший ответ

Это исправит ваш код:

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.

  • 0
    Это звучит намного лучше, чем использование исключений для обработки ежедневных ошибок конечного пользователя.
  • 0
    Действительно, это .. (=
Показать ещё 10 комментариев
0

Вы хотите захватить Exception и зарегистрировать его (удаленно), чтобы помочь в сбое отчетов и отладки? Я использовал этот пакет для удаленного захвата Исключений, и он работает очень хорошо:

http://code.google.com/p/android-remote-stacktrace/

  • 0
    Кроме того, Crittercism прекрасно работает для удаленных показателей сбоя и ведения журнала сеанса. Flurry можно настроить для регистрации сбоев, но он работает из коробки с Crittercism. И они оба бесплатны! - Хотя Flurry использует грязную веб-инфраструктуру Oracle .do
  • 0
    Таким образом, приложение не падает, даже если возникает исключение?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню