Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试调用虚拟方法';。。。距离';关于空对象引用_Java_Android_Location_Nullreferenceexception - Fatal编程技术网

Java 尝试调用虚拟方法';。。。距离';关于空对象引用

Java 尝试调用虚拟方法';。。。距离';关于空对象引用,java,android,location,nullreferenceexception,Java,Android,Location,Nullreferenceexception,我找遍了所有可能的地方,找到了娜达。我试图解决这件事已经有几个小时了,但运气不好。 我有一个功能,可以通过RequestLocationUpdate和getLastKnownLocation一次性获取我的位置。事情是这样的。如果手机上的定位服务被禁用,它会弹出一个alertDialog,询问用户是否想激活它,如果他想激活它,它会将用户带到设置窗口。如果服务关闭,用户转到“设置”窗口,激活它们,然后重试使用该功能,就会发生奇怪的事情。我后来在下面的活动中使用了我拼命想到达的位置,但它是对null的

我找遍了所有可能的地方,找到了娜达。我试图解决这件事已经有几个小时了,但运气不好。 我有一个功能,可以通过RequestLocationUpdategetLastKnownLocation一次性获取我的位置。事情是这样的。如果手机上的定位服务被禁用,它会弹出一个alertDialog,询问用户是否想激活它,如果他想激活它,它会将用户带到设置窗口。如果服务关闭,用户转到“设置”窗口,激活它们,然后重试使用该功能,就会发生奇怪的事情。我后来在下面的活动中使用了我拼命想到达的位置,但它是对null的引用,所以它崩溃了。如果我正常运行应用程序,它将崩溃,并出现以下错误:

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

如果我调试这个应用程序,它就可以正常工作。如果我在requestLocationUpdates和getLastKnownLocation之间启动3000毫秒的睡眠计时器,它有时工作,有时不工作。我很想得到一些帮助,因为我只是不知道

我之所以使用AsyncTask,是因为我认为它正在发生,因为设备无法在到达getLastKnownLocation()之前完成requestLocationUpdates(),所以我使用AsyncTask和.get(),以便它等待完成

下面是代码

定位接收器

ArrayList<ArrayList<String>> teachers = Client.getTeachers();
Location loc;
loc = gpsOps.getLocation();
Intent i = new Intent(getApplicationContext(), teachersScreen.class);
i.putExtra("teachers", teachers);
i.putExtra("location", loc);
startActivity(i);
ArrayList teachers=Client.getTeachers();
位置loc;
loc=gpsOps.getLocation();
Intent i=新Intent(getApplicationContext(),teachersScreen.class);
i、 putExtra(“教师”,教师);
i、 putExtra(“位置”,loc);
星触觉(i);
gpsOps.getLocation

public static Location getLocation()
{
    try {
        new AsyncGetLocation().execute().get();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
    List<String> providers = lm.getProviders(true);
    Location l = null;

    for (int i = providers.size() - 1; i >= 0; i--) {
        l = lm.getLastKnownLocation(providers.get(i));
        if (l != null) break;
    }
    return l;
}
公共静态位置getLocation()
{
试一试{
新建AsyncGetLocation().execute().get();
}捕捉(中断异常e){
e、 printStackTrace();
}捕获(执行例外){
e、 printStackTrace();
}
列表提供程序=lm.getProviders(true);
位置l=空;
对于(int i=providers.size()-1;i>=0;i--){
l=lm.getLastKnownLocation(providers.get(i));
如果(l!=null)中断;
}
返回l;
}
请求位置更新

public class AsyncGetLocation extends AsyncTask<Void,Void,Void> {
private ProgressBar dialog = null;
private Location loc = null;

@Override
protected void onPreExecute()
{

}

@SuppressLint("MissingPermission")
@Override
protected Void doInBackground(Void... Void)
{
    Log.e("doInBackground", "Entered getLocation");
    gpsOps.lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0.0f, gpsOps.ls, Looper.getMainLooper());
    return null;
}

@Override
protected void onPostExecute(Void aVoid)
{

}
公共类AsyncGetLocation扩展了AsyncTask{
private ProgressBar dialog=null;
私有位置loc=null;
@凌驾
受保护的void onPreExecute()
{
}
@SuppressLint(“丢失许可”)
@凌驾
受保护的Void doInBackground(Void…Void)
{
Log.e(“doInBackground”,“Entered getLocation”);
gpsOps.lm.requestLocationUpdates(LocationManager.GPS_提供程序,0,0.0f,gpsOps.ls,Looper.getMainLooper());
返回null;
}
@凌驾
受保护的void onPostExecute(void避免)
{
}
错误的命令序列

tempLoc = locs.get(teachers.get(x).get(3));
            if(loc.distanceTo(tempLoc) <= 30*1000)
                rangeFlag = true;
            else
                rangeFlag = false;
tempLoc=locs.get(teachers.get(x.get(3));

如果(loc.distance to(tempLoc)故障可能在这里:

for (int i = providers.size() - 1; i >= 0; i--) {
    l = lm.getLastKnownLocation(providers.get(i));
    if (l != null) break;
}
如果
providers.size()
为0,
l
null
因此,
loc
也将null。(因为
loc=gpsOps.getLocation()

或者,如果
lm.getLastKnownLocation(providers.get(i));
提供者的所有元素返回null,那么最后
loc
也将是null

您没有提到什么是
lm
,因此我更难深入了解问题,但我相信问题在于
for
循环中发生的事情

希望这个答案有帮助