【问题标题】:java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toString()' on a null object reference (HELP) [duplicate]java.lang.NullPointerException:尝试在空对象引用(帮助)上调用虚拟方法'java.lang.String java.lang.String.toString()'[重复]
【发布时间】:2019-02-25 17:08:52
【问题描述】:

当我按下骑手应用程序中的呼叫驱动程序按钮时。它在驱动程序应用程序上显示通知,但它崩溃了,因为它给出了调用空指针错误的错误。 在这一行出现空对象引用错误

(JSONObject jsonObject = new JSONObject(response.body().toString());)

这是我的 CustomerCall 课程

private void getDirection(double lat, double lng) {
    String requestAPI = null;
    try{

        requestAPI = "https://maps.googleapis.com/map/api/directions/json?"+
                "mode=driving&"+
                "transit_routing_preference=less_driving&"+
                "origin="+ Common.mLastLocation.getLatitude()+","+Common.mLastLocation.getLongitude()+"&"+
                "destination="+lat+","+lng+"&"+
                "key="+getResources().getString(R.string.google_direction_api);

        Log.d( "Sunny",requestAPI ); //print url for debug

        mService.getPath( requestAPI )
                .enqueue( new Callback<String>() {
                    @Override
                    public void onResponse(Call<String> call, Response<String> response) {

                            try {
                                JSONObject jsonObject = new JSONObject(response.body().toString());
                                JSONArray routes = jsonObject.getJSONArray("routes");

                                //after get routes,just get 1st element route
                                JSONObject object = routes.getJSONObject(0);

                                //after get 1st element, we need array with name "legs"
                                JSONArray legs = object.getJSONArray("legs");

                                //and get 1st element of legs array
                                JSONObject legsObject = legs.getJSONObject(0);

                                //Now get Distance
                                JSONObject distance = legsObject.getJSONObject("distance");
                                txtDistance.setText(distance.getString("text"));

                                //get time
                                JSONObject time = legsObject.getJSONObject("duration");
                                txtTime.setText(time.getString("text"));

                                //get address
                                String address = legsObject.getString("end_address");
                                txtAddress.setText(address);


                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }



                    @Override
                    public void onFailure(Call<String> call, Throwable t) {
                        Toast.makeText( CustomerCall.this, ""+t.getMessage(), Toast.LENGTH_SHORT ).show();

                    }
               } );

    }catch (Exception e)
    {
        e.printStackTrace();
    }
}

这里出现Logcat错误

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.shk.callingloader, PID: 12668
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toString()' on a null object reference
    at com.example.shk.callingloader.CustomerCall$1.onResponse(CustomerCall.java:90)
    at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:71)
    at android.os.Handler.handleCallback(Handler.java:790)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:7000)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:441)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)

【问题讨论】:

  • CustomerCall.java 中的第 90 行是哪一行?你的回复有正文吗?

标签: java android json nullpointerexception response


【解决方案1】:

错误信息说:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toString()' on a null object reference
    at com.example.shk.callingloader.CustomerCall$1.onResponse(CustomerCall.java:90)

我不确定第 90 行是什么,但我会说 response.body() 是 null 并且您正在调用 toString() 。为您的方法添加一个空检查,它应该可以工作。

您可以将代码打包到 if 语句中:

if(response.body() != null){
    //your try-catch block
}

或者如果正文为空,您可以返回:

if(response.body() == null){
    return;
}

【讨论】:

  • 第 90 行是 JSONObject jsonObject = new JSONObject(response.body().toString());
  • 对不起,我是 android 新手,您能指导我了解如何为此添加 null 检查的语法吗?
  • 这与安卓无关。我编辑了我的答案。
  • 我使用了这个空检查。通过这种方式,应用程序不会崩溃,但当通知到达驱动程序应用程序并且没有显示时间、距离和地址时,它仍然没有显示数据。
  • 这意味着您没有任何数据可显示在您的通知中。您的问题出在其他地方。
【解决方案2】:

而不是

JSONObject jsonObject = new JSONObject(response.body().toString());

尝试使用

JSONObject jsonObject = new JSONObject(response.body()); // remove .tostring()

【讨论】:

  • 我试过了,但它仍然给我同样的错误。
  • 这意味着你的 response.body() 是正确的空检查
  • 你能指导我怎么做吗?我是新手,从过去 5 天开始我就面临这个问题。我使用了 AndiCover 告诉的空检查,但就是这样。应用程序没有崩溃,但通知到来时没有显示数据
猜你喜欢
  • 2021-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 2015-02-09
相关资源
最近更新 更多