【问题标题】:Throwing Null Pointer Exception when finding the current co ordinates of the device查找设备当前坐标时抛出空指针异常
【发布时间】:2017-02-03 01:54:50
【问题描述】:

大家好,我正在尝试使用 GPS 和基于网络的方式查找当前设备的坐标。我正在为 API 23 测试这段代码。但这段代码返回 NullPointerException。代码如下:

public class AndroidLocationActivity extends Activity {

    Button btnGPSShowLocation;
    Button btnNWShowLocation;

    private static final int MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 2;

    protected LocationManager locationManager;
    Location location;

    private static final long MIN_DISTANCE_FOR_UPDATE = 10;
    private static final long MIN_TIME_FOR_UPDATE = 1000 * 60 * 2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_android_location);
        btnGPSShowLocation = (Button) findViewById(R.id.btnGPSShowLocation);
        btnNWShowLocation = (Button) findViewById(R.id.btnNWShowLocation);

    }

    public void mGPS(View view){
        Location gpsLocation = getLocation(LocationManager.GPS_PROVIDER);
        if (gpsLocation != null) {
            double latitude = gpsLocation.getLatitude();
            double longitude = gpsLocation.getLongitude();
            Toast.makeText(getApplicationContext(), "Mobile Location (GPS): \nLatitude: " + latitude + "\nLongitude: " + longitude, Toast.LENGTH_LONG).show();
        }
        else {
            showSettingsAlert("GPS");
        }
    }

    public void mNW(View view){
        Location nwLocation =getLocation(LocationManager.NETWORK_PROVIDER);
        if (nwLocation != null) {
            double latitude = nwLocation.getLatitude();
            double longitude = nwLocation.getLongitude();
            Toast.makeText(getApplicationContext(), "Mobile Location (NW): \nLatitude: " + latitude + "\nLongitude: " + longitude, Toast.LENGTH_LONG).show();
        }
        else {
            showSettingsAlert("NETWORK");
        }
    }

    public void showSettingsAlert(String provider) {
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(
                AndroidLocationActivity.this);

        alertDialog.setTitle(provider + " SETTINGS");

        alertDialog.setMessage(provider + " is not enabled! Want to go to settings menu?");

        alertDialog.setPositiveButton("Settings",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                        AndroidLocationActivity.this.startActivity(intent);
                    }
                });

        alertDialog.setNegativeButton("Cancel",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                });

        alertDialog.show();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    public Location getLocation(String provider) {
        if (locationManager.isProviderEnabled(provider)) {
            if(ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION)!=PackageManager.PERMISSION_GRANTED){
                ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);

            }
            else {
                locationManager.requestLocationUpdates(provider, MIN_TIME_FOR_UPDATE, MIN_DISTANCE_FOR_UPDATE, (LocationListener) this);
                if (locationManager != null) {
                    location = locationManager.getLastKnownLocation(provider);
                    return location;
                }
            }
        }
        return null;
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0 ) {
                    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                        Toast.makeText(this, "Permission Granted", Toast.LENGTH_SHORT).show();

                    }
                    else if(grantResults[0]==PackageManager.PERMISSION_DENIED) {
                        Toast.makeText(this, "Permission Denied", Toast.LENGTH_SHORT).show();
                    }
                    else {

                        Toast.makeText(this, "Never Ask Again", Toast.LENGTH_SHORT).show();
                    }
                }
                return;
            }
        }
    }
}

代码返回以下错误:

致命异常:主要 进程:com.cetpainfotech.locationtrackerapplication,PID:29068 java.lang.IllegalStateException:无法执行 android:onClick 的方法 在 android.view.View$DeclaredOnClickListener.onClick(View.java:4461) 在 android.view.View.performClick(View.java:5207) 在 android.view.View$PerformClick.run(View.java:21177) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5441) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628) 引起:java.lang.reflect.InvocationTargetException 在 java.lang.reflect.Method.invoke(本机方法) 在 android.view.View$DeclaredOnClickListener.onClick(View.java:4456) 在 android.view.View.performClick(View.java:5207) 在 android.view.View$PerformClick.run(View.java:21177) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5441) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628) 原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'boolean android.location.LocationManager.isProviderEnabled(java.lang.String)' 在 com.cetpainfotech.locationtrackerapplication.AndroidLocationActivity.getLocation(AndroidLocationActivity.java:108) 在 com.cetpainfotech.locationtrackerapplication.AndroidLocationActivity.mGPS(AndroidLocationActivity.java:52) 在 java.lang.reflect.Method.invoke(本机方法) 在 android.view.View$DeclaredOnClickListener.onClick(View.java:4456) 在 android.view.View.performClick(View.java:5207) 在 android.view.View$PerformClick.run(View.java:21177) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5441) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628)

我已经做了一个条件,如果函数 getLocation() 返回 null 那么它将显示一个警告对话框。相反,当我单击按钮时,它显示空指针异常。

我已经在 XML 文件中注册了 onClick 方法(mGPS 和 mNW)。

【问题讨论】:

  • 谢谢,但我已经知道什么是 NullPointerException。但我的问题是,尽管在 mGPS() 和 mNW() 中给出了 else 条件来处理 null,但此代码会引发异常。
  • 欢迎来到 StackOverflow。这个“重复”的评论意味着你应该花更多的时间来找出究竟什么是空的,然后再在这里发布一个问题,询问为什么会出现这种情况。如何发现?如果您对编程不太了解,请先阅读链接的帖子。如果您知道如何调试或如何写入 Logcat,那么现在正是这样做的好时机。您的代码中的 null 是什么?
  • 您的 locationManager 包含 null 因为您只创建了 LocationManager 的引用,这就是它抛出 NullPointerException 的原因。

标签: java android nullpointerexception illegalstateexception


【解决方案1】:

但我的问题是,尽管在 mGPS() 和 mNW() 中给出了 else 条件来处理 null,但此代码会引发异常

您的异常被抛出因为if 语句已评估变量为空。

if (locationManager.isProviderEnabled(provider)) {

这是一个正确的空检查。

if (locationManager != null && locationManager.isProviderEnabled(provider)) {

} else {

}

你实际上应该初始化你的变量并在 onCreate 中加入这样一行

locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE);

【讨论】:

    【解决方案2】:

    您没有初始化您的locationManager,因此当您调用locationManager.isProviderEnabled(provider) 时它会失败并显示NullPointerException

    这显示在您的堆栈跟踪中,就在这里

    原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“boolean android.location.LocationManager.isProviderEnabled(java.lang.String)”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      • 2020-08-10
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多