带有 Volley 的 HTTP Post 获取 NullPointerException:尝试从字段 'byte[] c.a.b.l.b' 读取

如何解决带有 Volley 的 HTTP Post 获取 NullPointerException:尝试从字段 'byte[] c.a.b.l.b' 读取

我使用 volley 向网络服务发送 POST 请求。它工作得很好,但有时,我不知道为什么,我收到这个错误,我不知道原因和如何控制它。我启用了 ACRA,这是关于我得到的错误的主要信息:

....
02-25 05:35:52.952 D\/InputMethodManager( 9979): prepareNavigationBarInfo() DecorView@72d70fd[ExportarDatos]
02-25 05:35:52.952 D\/InputMethodManager( 9979): getNavigationBarColor() -855310
02-25 05:35:52.968 E\/ViewRootImpl( 9979): sendUserActionEvent() mView returned.
02-25 05:35:53.194 D\/VOLLEY BODY SEND( 9979): {\"data\":{\"type\":.... rest of my json object}}
02-25 05:35:53.197 I\/System.out( 9979): (HTTPLog)-Static: isSBSettingEnabled false
02-25 05:35:53.197 I\/System.out( 9979): (HTTPLog)-Static: isSBSettingEnabled false
02-25 05:35:56.043 I\/System.out( 9979): (HTTPLog)-Static: isSBSettingEnabled false
02-25 05:35:56.043 I\/System.out( 9979): (HTTPLog)-Static: isSBSettingEnabled false
02-25 05:36:01.196 E\/VOLLEY  ( 9979): c.a.b.t
02-25 05:36:01.209 D\/AndroidRuntime( 9979): Shutting down VM
--------- beginning of crash
02-25 05:36:01.211 E\/AndroidRuntime( 9979): FATAL EXCEPTION: main
02-25 05:36:01.211 E\/AndroidRuntime( 9979): Process: com.mypack.myapp,PID: 9979
02-25 05:36:01.211 E\/AndroidRuntime( 9979): **java.lang.NullPointerException: Attempt to read from field 'byte[] c.a.b.l.b' on a null object reference**
02-25 05:36:01.211 E\/AndroidRuntime( 9979): \tat com.mypack.myapp.ExportarDatos$c.a(ExportarDatos.java:2)
02-25 05:36:01.211 E\/AndroidRuntime( 9979): \tat c.a.b.o.a(Request.java:7)
02-25 05:36:01.211 E\/AndroidRuntime( 9979): \tat c.a.b.g$b.run(ExecutorDelivery.java:6)
02-25 05:36:01.211 E\/AndroidRuntime( 9979): \tat android.os.Handler.handleCallback(Handler.java:883)
02-25 05:36:01.211 E\/AndroidRuntime( 9979): \tat android.os.Handler.dispatchMessage(Handler.java:100)
02-25 05:36:01.211 E\/AndroidRuntime( 9979): \tat android.os.Looper.loop(Looper.java:237)
02-25 05:36:01.211 E\/AndroidRuntime( 9979): \tat android.app.ActivityThread.main(ActivityThread.java:8107)
02-25 05:36:01.211 E\/AndroidRuntime( 9979): \tat java.lang.reflect.Method.invoke(Native Method)
02-25 05:36:01.211 E\/AndroidRuntime( 9979): \tat com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
02-25 05:36:01.211 E\/AndroidRuntime( 9979): \tat com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
02-25 05:36:01.213 E\/ACRA    ( 9979): ACRA caught a NullPointerException for com.mypack.myapp
02-25 05:36:01.213 E\/ACRA    ( 9979): java.lang.NullPointerException: Attempt to read from field 'byte[] c.a.b.l.b' on a null object reference
02-25 05:36:01.213 E\/ACRA    ( 9979): \tat com.mypack.myapp.ExportarDatos$c.a(ExportarDatos.java:2)
02-25 05:36:01.213 E\/ACRA    ( 9979): \tat c.a.b.o.a(Request.java:7)
02-25 05:36:01.213 E\/ACRA    ( 9979): \tat c.a.b.g$b.run(ExecutorDelivery.java:6)
02-25 05:36:01.213 E\/ACRA    ( 9979): \tat android.os.Handler.handleCallback(Handler.java:883)
02-25 05:36:01.213 E\/ACRA    ( 9979): \tat android.os.Handler.dispatchMessage(Handler.java:100)
02-25 05:36:01.213 E\/ACRA    ( 9979): \tat android.os.Looper.loop(Looper.java:237)
02-25 05:36:01.213 E\/ACRA    ( 9979): \tat android.app.ActivityThread.main(ActivityThread.java:8107)
02-25 05:36:01.213 E\/ACRA    ( 9979): \tat java.lang.reflect.Method.invoke(Native Method)
02-25 05:36:01.213 E\/ACRA    ( 9979): \tat com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
02-25 05:36:01.213 E\/ACRA    ( 9979): \tat com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)",...

这是向webservice发送POST/PATCH请求的函数。正如我所说,它在大多数情况下都运行良好,但有时我会收到错误消息,我不知道何时也不知道为什么:

private void SendRequest(String url,JSONObject jsonBody,boolean lPost) {
        if (mRequestQueue == null) {
            mRequestQueue = Volley.newRequestQueue(this);
        }

        final String mRequestBody = jsonBody.toString();
        Log.d("VOLLEY BODY SEND",mRequestBody);

        int nMetodo = Request.Method.POST;
        if (!lPost) nMetodo = Request.Method.PATCH;

        StringRequest stringRequest = new StringRequest(nMetodo,urlbase + url,new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                Log.i("VOLLEY",response);
            }
        },new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("VOLLEY",error.toString());
                error.networkResponse.data.toString();
                try {
                    String body = new String(error.networkResponse.data,"UTF-8");
                    Log.d("VOLLEY_ERROR",body);
                    txtError.setText(body);
                } catch (UnsupportedEncodingException e) {
                    e.printstacktrace();
                }
            }
        }) {
            @Override
            public Map<String,String> getHeaders() throws AuthFailureError {
                Map<String,String> params = new HashMap<String,String>();
                params.put("Accept","application/vnd.api+json");
                params.put("Content-Type","application/vnd.api+json");
                params.put("api-key",cparam);

                return params;
            }

            @Override
            public byte[] getBody() throws AuthFailureError {
                try {
                    return mRequestBody == null ? null : mRequestBody.getBytes("utf-8");
                } catch (UnsupportedEncodingException uee) {
                    VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s",mRequestBody,"utf-8");
                    return null;
                }
            }

            @Override
            protected Response<String> parseNetworkResponse(NetworkResponse response) {
                String responseString = "";
                if (response != null) {
                    responseString = String.valueOf(response.statusCode);
                    // can get more details such as response.headers
                    Log.d("VOLLEY",responseString);
                    String json = "";
                    try {
                        json = new String(response.data,HttpHeaderParser.parseCharset(response.headers));
                        jsonObjectRcv = new JSONObject(json);
                        // Process received object
                        handler.postDelayed(new Runnable() {
                           @Override
                           public void run() {
                               ProcessResponse(jsonObjectRcv);
                           }
                        },50);

                    } catch (Exception e) {
                        Log.d("VOLLEY",e.getMessage());
                    }
                }
                return Response.success(responseString,HttpHeaderParser.parseCacheHeaders(response));
            }
        };

        // Add to queue
        mRequestQueue.add(stringRequest);
    }

urlbase 是网络服务的主 URL。 url 参数是 POST/PATCH 的端点+资源。 jsonBody 是一个 JSON 对象,其中包含我想要 POST 或 PATH 的信息,它是正确的。我敢肯定,因为它包含在行中的 ACRA 中:

02-25 05:35:53.194 D\/VOLLEY BODY SEND( 9979): {\"data\":{\"type\":.... rest of my json object}} 

我想我已经添加了关于我的问题的所有信息来获取帮助,但是如果我应该添加更多信息,我会更新我的问题。我不知道是什么引发了 Nullpointer 异常。

我想捕获错误并让用户重试。现在,启动了 ACRA 错误并且应用停止工作。

解决方法

经过大量测试、失败和研究,问题是e.printStackTrace();。我已经删除了这一行并用 Log.e 进行了更改,问题就出来了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?