getApplicationContext() on a null object reference

60,524
public class Distance extends Application

Do not randomly extend classes, just because you think that it will clear up a compiler error. You do not have a valid Application subclass here, and you are not using it properly.

Step #1: Remove extends Application from Distance.

Step #2: Have getDistance() take a Context as a parameter, and have it use that with MySingleton

Step #3: Have MainActivity pass getApplicationContext() into getDistance() as the Context

Share:
60,524
Fluffeh
Author by

Fluffeh

Currently employed as a Senior Analyst focusing on Supply Chain and Replenishment. Mostly looking after rapid prototyping and proof of concepts, but meddling in data modeling, reporting and process flows. Have also worked on the Unreal Tournament series as a Level Designer and contributer to Unreal Developers Network. Current Free as in Beer project: http://code.google.com/p/wwwsqldesigner/ Question I am proud to ask How can an SQL query return data from multiple tables Answer I am most proud of: Creating query that returns id if condition is matched in rows from two tables Proud to be boycotting Slashdot and moving over to http://soylentnews.org/ instead. SOreadytohelp

Updated on May 17, 2021

Comments

  • Fluffeh
    Fluffeh about 3 years

    I allways get this java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference error while I run my app. I saw other answers but I didn't understand how to use those answer, I understood that there is some problem withe the context because there isn't call by Activity, so I also tried to pass the Activity context with no success... this is my code:

    EDIT I already did your answers and it'snt worked, so I deleted this becuase I thought it'snt the solution. Due to yours answers I updated the code(with context as parmerter to the Distance class >to MySingleton class...)

    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("");
                    
    
                }
            });
        }
    
    }
    
    
    public class 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);
        }
    
    }
    

    and this is the 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)
    
    • Madhukar Hebbar
      Madhukar Hebbar about 8 years
      getRequestQueue(MySingleton.java:24) check this.
    • Madhukar Hebbar
      Madhukar Hebbar about 8 years
      Problem with this line requestQueue = Volley.newRequestQueue(mCtx.getApplicationContext()); Your mCtx is null
    • Admin
      Admin about 8 years
      I understood this, so I passed the MainActivty contect to MySingleton, but I still get the same error...
  • Admin
    Admin about 8 years
    I already did that but I removed it from my code here. Anyway, I tried this agin and I got the same error
  • Admin
    Admin about 8 years
    Hey, I updated my code, like you answered me...what the problem is? I still get the same error
  • CommonsWare
    CommonsWare about 8 years
    @user5209063: You are going to need to determine how you are passing null into the MySingleton constructor.
  • Admin
    Admin about 8 years
    Sorry but I didnt understood what you wtore. I pass my MainActivty context , how it's null?
  • CommonsWare
    CommonsWare about 8 years
    @user5209063: I have no idea. If you follow the instructions in my answer, it cannot be null. However, you claim to get the same error, which means it must be null. I cannot help you further.
  • Admin
    Admin about 8 years
    Thanks, I have no idea what happend but I just add this Log Log.d("MySingleton",context.toString()); at the start of Distance class, and comiled it and it worked...weird, anyway Thanks a lot
  • Ben Neill
    Ben Neill over 6 years
    It is far better to pass in as a parameter rather than declaring it as a field that may or may not be null. This would not really add anything.
  • J. M.
    J. M. over 2 years
    You should put code for clerification...