简体   繁体   中英

Attempt invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference

why I dont know,I take this fault.The program was running before.But now I take this fault.Thank you for help...

MenuActivity.java:

final Context context = this;
private LocationManager mLocationManager;
private String PROVİDER = LocationManager.GPS_PROVIDER;
private GoogleMap googleHarita;
Location mLocation;

public class MenuActivity extends FragmentActivity {
    final Context context = this;
    private static final int CAMERA_REQUEST = 1888;

    TextView e_kor, b_kor, acikAdres;
    Fragment harita;
    RadarView mRadarView = null;

    private LocationManager mLocationManager;
    private String PROVİDER = LocationManager.GPS_PROVIDER;
    private GoogleMap googleHarita=null;

    Location mLocation = null;
    TelephonyManager telemamanger;
    String getSimSerialNumber;



    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu);

        // telefon numarası nesnesi
        telemamanger = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
        e_kor = (TextView) findViewById(R.id.enlmkor);
        b_kor = (TextView) findViewById(R.id.bylmkor);
        acikAdres = (TextView) findViewById(R.id.acikAdres);

        // resim metodu
        mRadarView = (RadarView) findViewById(R.id.radarView);

        // radar çalıştırma metodları
        mRadarView.setShowCircles(true);
        mRadarView.startAnimation();

        // Konum-lokasyon kodları
        mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        final Location mLocation = mLocationManager
                .getLastKnownLocation(PROVİDER);

        if (googleHarita == null) {
            googleHarita = ((SupportMapFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.haritafragment)).getMap();

            if (googleHarita != null) {
                LatLng koordinat = new LatLng(mLocation.getLatitude(),
                        mLocation.getLongitude());
                googleHarita.addMarker(new MarkerOptions().position(koordinat));
                googleHarita.moveCamera(CameraUpdateFactory.newLatLngZoom(
                        koordinat, 10));
            }
        }

        showLocation(mLocation);
        new GetAddressTask().execute(mLocation);

    }

    // Lokasyon işlemleri
    private void showLocation(Location location) {
        if (location == null) {
            Toast.makeText(getApplicationContext(), "Konum Bulunamadı",
                    Toast.LENGTH_SHORT).show();
        } else {
            e_kor.setText(location.getLatitude() + "");
            b_kor.setText(location.getLongitude() + "");
        }
    }   

    @Override
    protected void onPause() {
        super.onPause();
        mLocationManager.removeUpdates(listener);
    }

    @Override
    protected void onResume() {
        super.onResume();
        mLocationManager.requestLocationUpdates(PROVİDER, 0, 0, listener);
    }



    // Konum listener
    private LocationListener listener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            showLocation(location);
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }

        @Override
        public void onProviderEnabled(String provider) {
        }

        @Override
        public void onProviderDisabled(String provider) {
        }
    };

public class GetAddressTask extends AsyncTask<Location, Void, String> {

    @Override
    protected String doInBackground(Location... locations) {
        Geocoder geocoder = new Geocoder(MenuActivity.this);
        Location location = locations[0];
        List<Address> addresses;
        String addrStr = null;
        try {
            addresses = (List<Address>) geocoder.getFromLocation(
                    location.getLatitude(), location.getLongitude(), 5);
            Address addr = addresses.get(0);
            addrStr = addr.getAddressLine(0) + ", " + addr.getAdminArea()
                    + ", " + addr.getCountryName();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return addrStr;
    }

    @Override
    protected void onPostExecute(String result) {
        acikAdres.setText(result);
    }
}

My Log Cat:

11-10 02:20:50.508: E/AndroidRuntime(29376): FATAL EXCEPTION: main
11-10 02:20:50.508: E/AndroidRuntime(29376): Process: com.gpsacilbildirim, PID: 29376
11-10 02:20:50.508: E/AndroidRuntime(29376): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.gpsacilbildirim/com.gpsacilbildirim.MainActivity}: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.gpsacilbildirim/com.gpsacilbildirim.MenuActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference
11-10 02:20:50.508: E/AndroidRuntime(29376):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2658)
11-10 02:20:50.508: E/AndroidRuntime(29376):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2723)
11-10 02:20:50.508: E/AndroidRuntime(29376):    at android.app.ActivityThread.access$900(ActivityThread.java:172)
11-10 02:20:50.508: E/AndroidRuntime(29376):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1422)

The exception you're seeing in logcat points to a problem in the onCreate method of your activity.

The interesting part is this: java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference . It's telling you that whatever object you're calling getLatitude() on is null.

Looking at the body of the method, it's only possible on this line: LatLng koordinat = new LatLng(mLocation.getLatitude(), mLocation.getLongitude()); . Therefore you can tell that the crash is caused by mLocation being null.

You're initializing mLocation like this: mLocationManager.getLastKnownLocation(PROVİDER); . The documentation tells you it's possible to get a null return value if the provider is disabled.

That should answer the "why". Now you can think about the best way to work around this for your application. Can you try another provider? If none of the providers are enabled, can you default to a generic location? Do you want to show an error message instructing the user to enable location services and provide a way to try again?

the getLastKnownLocation() method can and will return null. The main problem is that it doesn't prompt a request to the OS for a new location lock, instead it just checks if there was a last known location from some other app's location request. If no other app had recently made a location request, then you get a null location returned to you.

The only way to guarantee that you actually get a location is to request one, and this is done with a call to requestLocationUpdates().

The location passed into the onLocationChanged() callback method will not be null, since the callback only occurs on a successful location lock.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM