关于Volley的JSON GET请求的java.lang.NullPointerException

时间:2014-11-20 03:21:50

标签: android json nullpointerexception get android-volley

我试图发送一个GET请求,传递一个身份验证令牌标头来获取一些JSON数据但是我在整个地方都得到了java.lang.NullPointerExceptions。我已经尝试过使用JSONObjectRequest,JSONArrayRequest甚至作为StringRequest。

这里是代码(JSONObjectRequest和JSONArrayRequest被评论用于测试):

 public void getJSON() {

    final String authToken = getAuth();
    String novaURL = getNova();
    novaURL = novaURL+"/servers";


    /**
___________________________________________________________________
    JsonArrayRequest getRequest = new JsonArrayRequest(novaURL,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    Log.d("Nova", response.toString());
                    setNovaJSON(response.toString());
                }
            }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
            VolleyLog.d("Nova", "Error: " + error.getMessage());
            }
    }
    ){
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String> params = new HashMap<String, String>();
            params.put("X-Auth-Token", authToken);
            params.put("Accept", "application/json");
            params.put("Content-Type", "application/json; charset=utf-8");
            return params;
        }
    };


    RequestQueue queue = Volley.newRequestQueue(this);
    queue.add(getRequest);

}

    JsonObjectRequest getRequest = new JsonObjectRequest(Request.Method.GET, novaURL, null,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    try {
                        JSONArray servers = response.getJSONArray("servers");
                    } catch (JSONException e) {
                        Toast.makeText(getApplicationContext(), "Error to get Instances", Toast.LENGTH_LONG).show();
                        e.printStackTrace();
                    }

                    Log.d("Nova", response.toString());
                    setNovaJSON(response.toString());
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    VolleyLog.d("Nova", "Error: " + error.getMessage());

                }
            }
    ) {
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String> params = new HashMap<String, String>();
            params.put("X-Auth-Token", authToken);
            params.put("Accept", "application/json");
            params.put("Content-Type", "application/json; charset=utf-8");
            return params;
        }

    };
 ________________________________________________________________ **/

    StringRequest getRequest = new StringRequest(Request.Method.GET,
            novaURL, new Response.Listener<String>() {

        @Override
        public void onResponse(String response) {
            Log.d("Nova", response.toString());
            setNovaJSON(response.toString());


        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d("Nova", "Error: " + error.getMessage());
        }
    }) {
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String> params = new HashMap<String, String>();
            params.put("X-Auth-Token", authToken);
            params.put("Accept", "application/json");
            params.put("Content-Type", "application/json; charset=utf-8");
            return params;
        }
    };

    RequestQueue queue = Volley.newRequestQueue(this);
    queue.add(getRequest);

}

此行发生异常:

RequestQueue queue = Volley.newRequestQueue(this);
  

11-20 13:44:28.623 14599-14599 / com.x.app D / AndroidRuntime:关闭VM   11-20 13:44:28.623 14599-14599 / com.x.app W / dalvikvm:threadid = 1:线程退出未捕获异常(组= 0x41642ce0)   11-20 13:44:28.643 14599-14599 / com.x.app E / AndroidRuntime:FATAL EXCEPTION:main       过程:com.stackerz.app,PID:14599       显示java.lang.NullPointerException               在android.content.ContextWrapper.getCacheDir(ContextWrapper.java:230)               在com.android.volley.toolbox.Volley.newRequestQueue(Volley.java:43)               在com.android.volley.toolbox.Volley.newRequestQueue(Volley.java:78)

很难找到发生了什么,因为错误不是很具描述性。如果它太明显,我会事先道歉但这是我的第一个应用程序而且我无法让它工作。我真的很感激一些帮助。

**更新:

我可能找到了一些有用的东西。我移动了行#34; RequestQueue queue = Volley.newRequestQueue(this);&#34;使用其他变量声明到方法的顶部,在调试之后,它甚至在获取JSONObjectRequest或StringRequest命令之前就崩溃了。似乎队列存在问题。

** UPDATE2:

我设法修复队列问题,添加一个扩展Application的Singleton类(也必须按照此处的步骤将其添加到Manifest作为Application而不是Activity):https://developer.android.com/training/volley/requestqueue.html

但是我仍然有例外:

java.lang.NullPointerException
        at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
        at org.json.JSONTokener.nextValue(JSONTokener.java:94)
        at org.json.JSONObject.<init>(JSONObject.java:155)
        at org.json.JSONObject.<init>(JSONObject.java:172)

在调试期间,我注意到它直接从&#34; getRequest&#34;声明(无论是JSONObjectRequest,JSONArrayRequest还是StringRequest)到Response.ErrorListener()。看起来它甚至没有尝试连接到URL。我测试了从REST浏览器到URL的连接,并确认它工作正常,生成JSON输出。

4 个答案:

答案 0 :(得分:2)

似乎 Volley.newRequestQueue(this)&#34; s&#34;这&#34;是空的。

答案 1 :(得分:0)

所有修复添加Singleton类扩展Application(也必须将其添加到Manifest作为Application而不是Activity),遵循以下步骤:https://developer.android.com/training/volley/requestqueue.html

导致另一个异常是因为凌空上的异步连接花费的时间太长。我通过在应用程序的加载中调用该方法来修复,为抽射提供时间来完成它。

答案 2 :(得分:0)

代码必须有问题

Volley.newRequestQueue(this)

方法签名是bolow:

public static RequestQueue newRequestQueue(Context context) {
    return newRequestQueue(context, null);
}

因此,您传递的内容应该是一个像活动实例或应用程序上下文的上下文。应用程序上下文要好得多。

答案 3 :(得分:0)

在manifestast应用程序标记中添加单例类名称

Singleton Class

class VolleyApplication extends Application {
----
----
}



Manifeast

<application
    android:name=".VolleyApplication"  --> Add this line
    ...>
    ...
</application>