Java AsyncTask中的NullPointerException
大家好,, 我有一个异步任务,根据用户输入的地址指向地图上的一个点。我在onPostExecute中有一个NullPointerException,我可以找出原因。下面是异步类Java AsyncTask中的NullPointerException,java,android,android-asynctask,Java,Android,Android Asynctask,大家好,, 我有一个异步任务,根据用户输入的地址指向地图上的一个点。我在onPostExecute中有一个NullPointerException,我可以找出原因。下面是异步类 private class GeocoderTask extends AsyncTask<String, Void, List<Address>>{ @Override protected List<Address> doIn
private class GeocoderTask extends AsyncTask<String, Void, List<Address>>{
@Override
protected List<Address> doInBackground(String... locationName) {
// Creating an instance of Geocoder class
Geocoder geocoder = new Geocoder(getBaseContext());
List<Address> addresses = null;
try {
// Getting only one address that matches the query
addresses = geocoder.getFromLocationName(locationName[0], 3);
} catch (IOException e) {
e.printStackTrace();
}
return addresses;
}
@Override
protected void onPostExecute(List<Address> addresses) {
if(addresses==null || addresses.size()==0){
Toast.makeText(getBaseContext(), "No Location found.Please check address", Toast.LENGTH_SHORT).show();
}
// Clears all the existing markers on the map
mMap.clear();
// Adding Markers on Google Map for each matching address
for(int i=0;i<addresses.size();i++){// this is line 585 from the logcat
Address address = (Address) addresses.get(i);
// Creating an instance of GeoPoint, to display in Google Map
LatLng latLng_search = new LatLng(address.getLatitude(), address.getLongitude());
String addressText = String.format("%s, %s",
address.getMaxAddressLineIndex() > 0 ? address.getAddressLine(0) : "",
address.getLocality());
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.position(latLng_search);
markerOptions.title(addressText);
mMap.addMarker(markerOptions);
// Locate the first location
if(i==0)
mMap.animateCamera(CameraUpdateFactory.newLatLng(latLng_search));
}
}
}
错误出现在第585行,我已在代码中对此进行了标记。该行中仅有2个变量是i和address,我检查address是否为null。我不明白为什么我仍然得到一个空指针异常
如果您需要查看更多的代码,请告诉我
感谢您花时间阅读此内容并提供帮助。如评论中所述,您的
地址变量很可能为空
在条件语句中检查地址
是否为空
,但实际上从未处理过这种情况。如果addresses
为null
则您只需通过Toast通知用户,但几秒钟后(甚至在Toast的动画加载到屏幕之前),您的程序就会崩溃
您需要处理地址
为null
(也就是说,不要调用变量上的方法并尝试填充变量,或者完全不同的东西),或者确保它永远不为null
,正如注释中所建议的,您的地址
变量很可能为null
if(addresses==null || addresses.size()==0){
Toast.makeText(getBaseContext(), "No Location found.Please check address", Toast.LENGTH_SHORT).show();
return; // add this
}
在条件语句中检查地址
是否为空
,但实际上从未处理过这种情况。如果addresses
为null
则您只需通过Toast通知用户,但几秒钟后(甚至在Toast的动画加载到屏幕之前),您的程序就会崩溃
您需要处理地址
为空
的情况(即,不调用变量上的方法并尝试填充变量,或完全不同的内容),或者确保它永远不会是空的,因为现在即使你的地址是空的或者是地址。size=0,for循环也会用空值执行,并给出NPE,因为现在即使你的地址是空的或者是地址。size=0,for循环也会用空值并给出NPE您的地址为空。此addresses=geocoder.getFromLocationName(locationName[0],3)
可能会失败。并使用活动上下文Geocoder Geocoder=new Geocoder(ActivtiyName.this)
您的地址为空。此addresses=geocoder.getFromLocationName(locationName[0],3)
可能会失败。并使用活动上下文Geocoder Geocoder=new Geocoder(activityname.this)
if(addresses==null || addresses.size()==0){
Toast.makeText(getBaseContext(), "No Location found.Please check address", Toast.LENGTH_SHORT).show();
return; // add this
}