Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何处理json异常以防止应用程序崩溃?_Java_Android - Fatal编程技术网

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

Java 如何处理json异常以防止应用程序崩溃?,java,android,Java,Android,我正在开发一个android应用程序,它显示URL中返回json的图像。但每当json返回空值时,我的应用程序就会崩溃并关闭。我还尝试了一些处理null的方法,但不确定它是否正确。这是我的密码 private class DownloadJSON extends AsyncTask<Void, Void, Void> { @Override protected void onPreExecute() { super.onPreExecute();

我正在开发一个android应用程序,它显示URL中返回json的图像。但每当json返回空值时,我的应用程序就会崩溃并关闭。我还尝试了一些处理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();

    }
}
日志:


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

您应该在try-catch块中移动JSONfunctions.getJSONfromURL。

您应该在try-catch块中移动JSONfunctions.getJSONfromURL。

任何异常都可以使用try-catch块来处理

try{
  // code that may throw exception
}catch(org.json.JSONException exception){
  // how you handle the exception
  // e.printStackTrace();
}  
更新: 您正在迭代一个JSONArray并查看该数组的文档,它说:

密集的索引值序列。值可以是以下各项的任意组合: JSONObject、其他JSONArray、字符串、布尔值、整数、长字符串、, 双精度,null或null

这意味着数组中可能存在JSONObject.NULL值。这就是您的错误状态。尝试添加一个if-else来检查您得到了什么

更多信息:

任何异常都可以通过使用try-catch块来处理

try{
  // code that may throw exception
}catch(org.json.JSONException exception){
  // how you handle the exception
  // e.printStackTrace();
}  
更新: 您正在迭代一个JSONArray并查看该数组的文档,它说:

密集的索引值序列。值可以是以下各项的任意组合: JSONObject、其他JSONArray、字符串、布尔值、整数、长字符串、, 双精度,null或null

这意味着数组中可能存在JSONObject.NULL值。这就是您的错误状态。尝试添加一个if-else来检查您得到了什么


更多信息:

JSONException类将处理Json异常 将您的JSONfunctions.GetJSONFromUrl放在Try块中,这将在应用程序崩溃时起作用

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

JSONException类将处理Json异常 将您的JSONfunctions.GetJSONFromUrl放在Try块中,这将在应用程序崩溃时起作用

尝试将Json解析为从服务器获取响应 无论响应是JsonObject还是JsonArray。

如果出现错误,请尝试以相同的格式从服务器做出响应。

如果您在doInBackground内调用Toast,请删除Toast消息。您不能在doInBackground内调用Toast

如果您在doInBackground内调用Toast,请删除Toast消息。您不能在doInBackground中调用Toast

完整的堆栈跟踪请。。。不仅仅是第一行。完整的堆栈跟踪请。。。不仅仅是第一行。鉴于提供的错误信息最少,这看起来是最可能的解决方案。@user3652550您希望在新建loadMoreListView.execute之后使用jsonobject;,在使用它之前,请检查它是否为null,并在try-catch块中包含JSON加载程序,如所述。cf@user3652550-您做了什么,它是如何不起作用的?提供的修复程序应该可以防止您在logcat中获得该异常。这就是你想要的。。。是吗?鉴于提供的错误信息最少,这似乎是最可能的解决方案。@user3652550您希望在新建loadMoreListView.execute之后使用jsonobject;,在使用它之前,请检查它是否为null,并在try-catch块中包含JSON加载程序,如所述。cf@user3652550-您做了什么,它是如何不起作用的?提供的修复程序应该可以防止您在logcat中获得该异常。这就是你想要的。。。不是吗?我认为第二段是个糟糕的建议。JSON应该被解析为一个或另一个,这取决于应用程序能够处理的问题。只有当应用程序能够真正处理这两种形式时,才尝试以任何一种方式解析它。接受许多不同的表格是没有意义的,除非它们有不同的含义。我认为第二段是错误的建议。JSON应该被解析为一个或另一个,这取决于应用程序能够处理的问题。只有当应用程序能够真正处理这两种形式时,才尝试以任何一种方式解析它。接受许多不同的表格是没有意义的,除非它们有不同的含义。@StephenC看一下我的更新。请帮助我处理JSONObject.NULL。我想这就是问题所在?我不知道。我认为其他答案是正确的。他只需要将getJSONfromURL调用放在try/catch.OP中就行了。他说这对@Stephen没有帮助C@StephenC看看我的更新。请帮助我处理JSONObject.NULL。我想这就是问题所在?我不知道。我认为其他答案是正确的。他只需要将getJSONfromURL调用放在try/catch.OP中就行了。他说这对@Stephen C没有帮助