web-dev-qa-db-fra.com

getApplicationContext () sur une référence d'objet null

J'obtiens toujours cette erreur Java.lang.NullPointerException: Attempt to invoke virtual method 'Android.content.Context Android.content.Context.getApplicationContext()' on a null object reference lorsque j'exécute mon application. J'ai vu d'autres réponses mais je n'ai pas compris comment les utiliser, j'ai compris qu'il y a un problème avec le contexte car il n'y a pas d'appel par Activity, j'ai donc également essayé de passer le contexte Activity sans succès ... voici mon code:

[~ # ~] modifier [~ # ~] J'ai déjà répondu et cela n'a pas fonctionné, j'ai donc supprimé c'est parce que je pensais que ce n'était pas la solution. En raison de vos réponses, j'ai mis à jour le code (avec le contexte comme parmerter à la classe Distance> à la classe MySingleton ...)

public class MainActivity extends AppCompatActivity {

    private Button b;
    private TextView t;
    private LocationManager locationManager;
    private LocationListener listener;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        t = (TextView) findViewById(R.id.textView);
        b = (Button) findViewById(R.id.button);

        locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);


        listener = new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {
                Log.d("Co", "onLocationChanged");
                Distance distance=new Distance();
                t.setText("\n " + location.getLongitude() + " " + location.getLatitude()+"\n "+distance.getDistance(location));

                Location l2=new Location("");

                //float distance=location.distanceTo(l2);
                Log.d("Co", String.valueOf(distance));
            }

            @Override
            public void onStatusChanged(String s, int i, Bundle bundle)   {

            }

            @Override
            public void onProviderEnabled(String s) {

            }

            @Override
            public void onProviderDisabled(String s) {

                Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                startActivity(i);
            }
        };

        configure_button();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode){
            case 10: {
                configure_button();
                Log.d("Co", "premmsioenChecks");

            }
            break;
            default:
                break;
        }
    }

    public void configure_button(){
        // first check for permissions
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.INTERNET}
                        ,10);
                Log.d("Co", "premmsioen");

            }
            return;
        }
        // this code won't execute IF permissions are not allowed, because in the line above there is return statement.
        b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //noinspection MissingPermission


                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener);
                locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, listener);
                Log.d("Co", "onClick");
                Location l2=new Location("");


            }
        });
    }

}

classe public Distance {

static  String url = "";
static String result="";

public  String getDistance(Location location,Context context) {

    Log.d("app","getDistance");






            String origins=location.getLatitude()+","+location.getLongitude();

            url="https://maps.googleapis.com/maps/api/distancematrix/json?&origins="+origins+"&destinations="+destinations;
            Log.d("URL",url);
            JsonObjectRequest jsObjRequest = new JsonObjectRequest

                    (Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

                        @Override
                        public void onResponse(JSONObject response) {
                            Log.d("app","onRespone");

                            String distance=getText(response);
                            if (distance.contains("Error")) {
                                result=distance;
                                return;
                            }
                            else {
                                if (distance.contains("km")) {
                                    int meters = Integer.parseInt(distance.replaceAll("[\\D]", "")) * 1000;
                                   result= "The distance is " + meters + " meters";
                                    return;
                                }
                                Log.d("7", String.valueOf(Integer.parseInt(distance.replaceAll("[\\D]", ""))));

                                result= "The distance is " + distance;
                            }



                        }
                    }, new Response.ErrorListener() {

                        @Override
                        public void onErrorResponse(VolleyError error) {
                            Log.d("app","Error Respone");

                        }
                    }
                    );
            MySingleton.getInstance(context).addToRequestque(jsObjRequest);
    return result;
        }




public  String getText(JSONObject response)
{
    String  text="";
    try {

        JSONArray rows = response.getJSONArray("rows");
        Log.d("1", rows.toString());
        if(rows.toString().contains("[]"))  return text="Error";
        JSONObject elements = rows.getJSONObject(0);
        Log.d("2", elements.toString());
        rows = elements.getJSONArray("elements");
        Log.d("3", rows.toString());
        elements  = rows.getJSONObject(0);
        Log.d("4", elements.toString());
        Log.d("Error1","Error is @"+elements.getString("status"));
        if( elements.getString("status").contains("OK"))
        {
            JSONObject d = elements.getJSONObject("distance");
            Log.d("5", d.toString());
            text = d.getString("text");
        }
        else {
            Log.d("Error2", elements.getString("status"));
            text = "Error-" + elements.getString("status");
        }

    }
    catch (JSONException e)
    {
        text="Some error ocuerd";
    }
    return text;
}

}

public class MySingleton {
    private static MySingleton mInstance;
    private RequestQueue requestQueue;
    public static Context mCtx;
    private MySingleton(Context context)
    {
        mCtx=context;
        requestQueue= getRequestQueue();
    }

    public RequestQueue getRequestQueue() {
        if(requestQueue==null) {
            requestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
        }
        return requestQueue;
    }
    public static synchronized MySingleton getInstance(Context context)
    {
        if(mInstance==null)
        {
            mInstance=new MySingleton(context);
        }
        return mInstance;
    }
    public <T> void addToRequestque(Request<T> request)
    {
        requestQueue.add(request);
    }

}

et c'est le logcat

06-24 16:19:26.771 25300-25300/com.example.elicahi.gateor D/Co: onClick
06-24 16:19:27.556 25300-25300/com.example.elicahi.gateor D/Co: onLocationChanged

06-24 16:19:27.579 25300-25300/com.example.elicahi.gateor D/AndroidRuntime: Shutting down VM
06-24 16:19:27.579 25300-25300/com.example.elicahi.gateor E/AndroidRuntime: FATAL EXCEPTION: main
                                                                            Process: com.example.elicahi.gateor, PID: 25300
                                                                            Java.lang.NullPointerException: Attempt to invoke virtual method 'Android.content.Context Android.content.Context.getApplicationContext()' on a null object reference
                                                                                at Android.content.ContextWrapper.getApplicationContext(ContextWrapper.Java:107)
                                                                                at com.example.elicahi.gateor.MySingleton.getRequestQueue(MySingleton.Java:24)
                                                                                at com.example.elicahi.gateor.MySingleton.<init>(MySingleton.Java:19)
                                                                                at com.example.elicahi.gateor.MySingleton.getInstance(MySingleton.Java:32)
                                                                                at com.example.elicahi.gateor.Distance.getDistance(Distance.Java:79)
                                                                                at com.example.elicahi.gateor.MainActivity$1.onLocationChanged(MainActivity.Java:54)
                                                                                at Android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.Java:285)
                                                                                at Android.location.LocationManager$ListenerTransport.-wrap0(LocationManager.Java)
                                                                                at Android.location.LocationManager$ListenerTransport$1.handleMessage(LocationManager.Java:230)
                                                                                at Android.os.Handler.dispatchMessage(Handler.Java:102)
                                                                                at Android.os.Looper.loop(Looper.Java:148)
                                                                                at Android.app.ActivityThread.main(ActivityThread.Java:5417)
                                                                                at Java.lang.reflect.Method.invoke(Native Method)
                                                                                at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:726)
                                                                                at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:616)
10
user5209063
public class Distance extends Application

N'étendez pas les classes de manière aléatoire, simplement parce que vous pensez que cela effacera une erreur de compilation. Vous n'avez pas de sous-classe Application valide ici et vous ne l'utilisez pas correctement.

Étape # 1: supprimez extends Application De Distance.

Étape # 2: Demandez à getDistance() de prendre un Context comme paramètre, et de le faire utiliser avec MySingleton

Étape # 3: Demandez à MainActivity de passer getApplicationContext() dans getDistance() comme Context

11
CommonsWare

Ce n'est pas vraiment une réponse, mais juste une idée.

J'avais le même problème (c'est comme ça que je suis arrivé à cette question) et mon problème était en fait très simple. J'essayais de définir RequestQueue avant de définir mon contexte privé dans mon Singleton.

  private MySingleton(Context context) {
    ctx = context; // queue = getRequestQueue();    <--- queue first but it needs context.
    queue = getRequestQueue();    // ctx = context;   <--- ctx being set here. queue can't find context.
 }

public synchronized static MySingleton getInstance(Context context) {
    if (instance == null) {
        instance = new MySingleton(context);
    }
    return instance;
}

private RequestQueue getRequestQueue() {
    if (queue == null) {
        queue = Volley.newRequestQueue( ctx.getApplicationContext() ); // <--- Here is the crash;
    }
    return queue;
}

De plus, avant de trouver ce problème, je me suis assuré que le contexte n'était pas nul lors de son passage en tant que paramètre. Cela signifie que le problème devait être quelque part dans le code MySingleton.

// This code is run before MySingleton.getInstance() wherever it is in your app;
Context testParameter = getBaseContext();
Log.d("DEBUG_CONTEXT", testParameter.toString() );

Je partage donc mon problème et j'espère qu'il pourrait vous apporter quelques idées. Bonne chance.

0
Lucas Nantes