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)
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
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.