Android 如何防止我的应用程序意外崩溃;“强制关闭”;,当使用JSON数据时,是否改为处理异常?

Android 如何防止我的应用程序意外崩溃;“强制关闭”;,当使用JSON数据时,是否改为处理异常?,android,sql,json,try-catch,Android,Sql,Json,Try Catch,在我的应用程序中,我有一个食物活动,用户在其中输入他/她的食物,应用程序根据用户输入的名称从MYSQL数据库请求食物。如果输入的食物不存在,则数据库返回的字符串应为空 当前,发生这种情况时,会发生异常,因为无法将null值解析为JSON数组。我的问题是:“有没有办法阻止我的应用程序强制关闭?我是否可以处理异常并显示一个祝酒词,通知用户没有找到请求的食物?”我想防止应用程序崩溃,而不是优雅地失败 请帮帮我 我已经在我的应用程序中显示了相关代码 private class LoadData exte

在我的应用程序中,我有一个食物活动,用户在其中输入他/她的食物,应用程序根据用户输入的名称从MYSQL数据库请求食物。如果输入的食物不存在,则数据库返回的字符串应为空

当前,发生这种情况时,会发生异常,因为无法将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()); 
        }   
    }
}
私有类LoadData扩展异步任务
{ 
私人杰索纳雷·贾雷;
私有字符串结果=null;
私有InputStream为空;
输入的私有字符串_food_name=choice.getText().toString().trim();
受保护的void onPreExecute()
{
}
@凌驾
受保护字符串doInBackground(无效…参数)
{
试一试{
ArrayList nameValuePairs=新的ArrayList();
HttpClient HttpClient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(“http://10.0.2.2/food.php");
添加(新的BasicNameValuePair(“名称”,输入食物名称));
setEntity(新的UrlEncodedFormEntity(nameValuePairs,“UTF-8”);
HttpResponse response=httpclient.execute(httppost);
HttpEntity=response.getEntity();
is=entity.getContent();
//将响应转换为字符串
BufferedReader reader=新的BufferedReader(新的InputStreamReader(is,“utf-8”),8;
StringBuilder sb=新的StringBuilder();
字符串行=null;
而((line=reader.readLine())!=null){
某人附加(行);
}
is.close();
结果=sb.toString();
result=result.replace(“\”,“\”).trim();
}
捕获(例外e){
Log.e(“Log_标记”,“连接”+e.toString());
}
返回结果;
}
@凌驾
受保护的void onPostExecute(字符串结果)
{  
试一试{
字符串foodName=“”;
int Description=0;
jArray=new-JSONArray(result);//这里,如果结果为null,将出现一个exeption
JSONObject json_data=null;
for(int i=0;i
您是否希望捕获异常并(远程)记录它,以帮助崩溃报告和调试?我使用此软件包远程捕获异常,效果非常好:


这将修复您的代码:

jArray = (result == null) ? new JSONArray() : new JSONArray(result);
现在您有了一个空的JSONArray,以后您就可以在程序中测试空JSONObject了

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


最后,如果您仍然得到
JSONException
s,这是因为您没有向构造函数传递有效的JSON字符串。您可以将
result
的值打印到日志中:

Log.d("JSON Data", result);
您可能会看到一些SQL错误文本,或者如果从web服务器检索,则会出现HTTP错误代码(如果url不正确,则404是常见的)


如果您的结果看起来确实像JSON,那么您可以使用验证它是否真的是有效的JSON。它将帮助您捕获可能存在的任何错误,特别是如果您自己正在格式化JSON。

您是否尝试将MakeToos放入您拥有的捕获中?如果是,发生了什么?我尝试将toast放入捕获中,但是当结果返回为null时,应用程序仍会崩溃您是否检查了logcat,是否确定null值使用的是JSONException而不是NullPointerException?是的,这是我在log:log_标记(935)中的异常:parssingorg.json.JSONException:Value另外,CriterCism对于远程崩溃度量和会话日志记录非常有效。Flurry可以设置为记录崩溃,但它与CriterCism一起开箱即用。而且,它们都是免费的!——尽管Flurry使用Oracle的讨厌的.do web框架。这样,即使发生异常,应用程序也不会崩溃?因为我真的很想在我的应用程序中直接处理异常,通知用户他输入的食物不存在,这是可能的吗?我希望能帮助我,因为我是Android新手。这听起来比诉诸异常来处理日常最终用户错误要好得多。谢谢,在这种情况下,如果我ts null,然后我做吐司“输入的食物不存在"?如果返回的结果为空,则不会发生解析异常?这是真的还是我不理解你的意思?请帮助我,基本上,在调用解析程序之前确保它不是空的。谢谢,我尝试了它,并通过输入未存储的食物名称测试了我的应用程序,但异常仍然会发生?你能解释一下我如何做到这一点吗在android中是新的吗?请帮助我将
null
值传递给构造函数时会发生异常。它不同于创建null对象的无参数构造函数。发生的异常是Java.lang.NullPointerException,而不是JSON.org.jsoneException。这是一个运行时异常,您不能看到哈
Log.d("JSON Data", result);