如何处理json异常以防止应用程序崩溃?

时间:2014-07-02 12:15:54

标签: java android

我正在开发一个Android应用程序,它显示来自URL的图像,它返回一个json。但是每当json返回null值时,我的应用程序就会一直崩溃并关闭。我也尝试过处理null但不确定它是否正确。这是我的代码

private class DownloadJSON extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // Create a progressdialog
        mProgressDialog = new ProgressDialog(GridActivity.this);
        // Set progressdialog title
        mProgressDialog.setTitle("Fetching Images");
        // Set progressdialog message
        mProgressDialog.setMessage("Loading...");
        mProgressDialog.setIndeterminate(false);
        // Show progressdialog
        mProgressDialog.show();
    }

    @Override
    protected Void doInBackground(Void... params) {
        // Create an array
        arraylist = new ArrayList<HashMap<String, String>>();
        // Retrieve JSON Objects from the given URL address
        jsonobject = JSONfunctions
                .getJSONfromURL("http://url.com");
        try {
            // Locate the array name in JSON
            jsonarray = jsonobject.getJSONArray("wallpaper");
            if(jsonobject==null) {
                Toast.makeText(GridActivity.this, "error" , Toast.LENGTH_SHORT).show();
            } else{


                for (int i = 0; i < jsonarray.length(); i++) {
                    HashMap<String, String> map = new HashMap<String, String>();
                    jsonobject = jsonarray.getJSONObject(i);
                    // Retrive JSON Objects
                    //  map.put("rank", jsonobject.getString("rank"));
                    map.put("category", jsonobject.getString("category"));
                    //   map.put("population", jsonobject.getString("population"));
                    map.put("image", jsonobject.getString("image"));
                    // Set the JSON Objects into the array
                    arraylist.add(map);
                }
            }
        } catch (JSONException e) {
            Toast.makeText(GridActivity.this,"Error on the response", 3000).show();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void args) {


        gridview =(GridView)findViewById(R.id.gridViewCustom);
        // Pass the results into ListViewAdapter.java
        adapter = new GridViewAdapter(GridActivity.this, arraylist);


        button = (Button) findViewById(R.id.button);

        // add button listener
        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                //Log.v("obj", "Creating view..." + jsonobject);
               // Log.v("arry", "Creating view..." + jsonarray);
                new loadMoreListView().execute();
            }
        });
        // Set the adapter to the ListView
        gridview.setAdapter(adapter);
        // Close the progressdialog
        mProgressDialog.dismiss();

    }
}

logcat的:

07-02 17:38:07.069 11429-11461 / com.fbphoto_comments.app E / log_tag:解析数据时出错org.json.JSONException:类型org.json.JSONObject $ 1的值null无法转换为JSONObject

4 个答案:

答案 0 :(得分:4)

可以使用Exception块处理任何try-catch

try{
  // code that may throw exception
}catch(org.json.JSONException exception){
  // how you handle the exception
  // e.printStackTrace();
}  

<强>更新
您正在迭代JSONArray并查看相同的文档,它说:

  

密集索引的值序列。价值观可以是任何组合   JSONObjects,其他JSONArrays,字符串,布尔值,整数,Longs,   双打,空或NULL。

这意味着数组中可能存在 JSONObject.NULL 值。这就是你的错误所说的。尝试添加if-else以检查您获得的内容。

更多信息:http://developer.android.com/reference/org/json/JSONObject.html#NULL

答案 1 :(得分:1)

你应该在try-catch块中移动你的JSONfunctions.getJSONfromURL(“http://url.com”)。

答案 2 :(得分:0)

JSONException类将处理Json异常 将你的JSONfunctions.getJSONfromURL(&#34; http://url.com&#34;)放入Try块中,这将在app崩溃时起作用。

尝试将Json解析为从服务器获取响应 无论是响应中的JsonObject还是JsonArray。 如果出现错误,请尝试以相同的格式从服务器进行响应。

答案 3 :(得分:0)

你在doInBackground()里面调用Toast,删除toast消息。你不能在doInBackground中调用Toast