2012-06-22 82 views
0

我让这个类获取用户的当前位置,并将它与数据库中的经度和纬度进行比较,它给了我空指针异常,有人可以帮我吗? 我只想与纬度进行比较,并且想要获得50个范围内的所有对象。经度和纬度NullPointerException

public class locationFinder extends ListActivity implements LocationListener { 

    EgyptDataSource datasource; 
    Location locObject; 
    String loc; 
    double lat; 
    double longi; 
    List<Integer> indexes; 
    List<Hotel> newHotels = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     LocationManager locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); 

     Intent i = getIntent(); 
     String category = i.getStringExtra("category"); 

     if(category.equals("hotels")) 
     { 
      List<Hotel> Latvalues = datasource.getAllHotelsLat(); 

      float[] distance = new float[Latvalues.size()]; 
      for (int j = 0; j < Latvalues.size(); j++) { 
      Location.distanceBetween(lat, longi, Latvalues.get(j).toDoubleLat(), 0.0, distance); 
      if(distance[0] <50) 
      { 
       indexes.add(j); 
      } 
     } 
     List<Hotel> allHotels = datasource.getAllHotels(); 
     for (int q = 0; q < allHotels.size(); q++) { 
      for (int w = 0; w < indexes.size(); w++) { 
       if(q == indexes.get(w)) 
       { 
        newHotels.add(allHotels.get(q)); 
       } 
      } 
     } 

     if (newHotels.isEmpty()) 
     { 
      Toast.makeText(this, "No results found!", Toast.LENGTH_LONG).show(); 
      Intent i1 = new Intent(locationFinder.this, hotelSearch.class); 
      startActivity(i1); 
     } 

     ArrayAdapter<Hotel> adapter = new ArrayAdapter<Hotel>(this, android.R.layout.simple_list_item_1, newHotels); 
     setListAdapter(adapter); 

     } 
    } 

    public void onLocationChanged(Location location) { 
     lat = location.getLatitude(); 
     longi = location.getLongitude();   
    } 

    public void onProviderDisabled(String provider) {  
} 

public void onProviderEnabled(String provider) {   
} 

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

} 

这里是logcat的

06-22 18:29:04.261: E/AndroidRuntime(30183): FATAL EXCEPTION: main 
06-22 18:29:04.261: E/AndroidRuntime(30183): java.lang.RuntimeException: Unable to start activity ComponentInfo{egypt.interfaceAct/egypt.interfaceAct.locationFinder}: java.lang.NullPointerException 
06-22 18:29:04.261: E/AndroidRuntime(30183): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2781) 
06-22 18:29:04.261: E/AndroidRuntime(30183): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2797) 
06-22 18:29:04.261: E/AndroidRuntime(30183): at android.app.ActivityThread.access$2300(ActivityThread.java:135) 
06-22 18:29:04.261: E/AndroidRuntime(30183): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2132) 
06-22 18:29:04.261: E/AndroidRuntime(30183): at android.os.Handler.dispatchMessage(Handler.java:99) 
06-22 18:29:04.261: E/AndroidRuntime(30183): at android.os.Looper.loop(Looper.java:143) 
06-22 18:29:04.261: E/AndroidRuntime(30183): at android.app.ActivityThread.main(ActivityThread.java:4914) 
06-22 18:29:04.261: E/AndroidRuntime(30183): at java.lang.reflect.Method.invokeNative(Native Method) 
06-22 18:29:04.261: E/AndroidRuntime(30183): at java.lang.reflect.Method.invoke(Method.java:521) 
06-22 18:29:04.261: E/AndroidRuntime(30183): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
06-22 18:29:04.261: E/AndroidRuntime(30183): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
06-22 18:29:04.261: E/AndroidRuntime(30183): at dalvik.system.NativeStart.main(Native Method) 
06-22 18:29:04.261: E/AndroidRuntime(30183): Caused by: java.lang.NullPointerException 
06-22 18:29:04.261: E/AndroidRuntime(30183): at egypt.interfaceAct.locationFinder.onCreate(locationFinder.java:47) 
06-22 18:29:04.261: E/AndroidRuntime(30183): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1065) 
06-22 18:29:04.261: E/AndroidRuntime(30183): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2745) 
06-22 18:29:04.261: E/AndroidRuntime(30183): ... 11 more 
+0

添加此代码是否使用真实设备或模拟器。我以前从未使用'LocationManager',但它听起来像是模拟器可能不支持的东西。 –

+0

使用'Try - Catch'并记录'Exception',然后在您的问题中发布异常。 – jnthnjns

回答

2

您还没有初始化的变量newHotels。添加下面一行在你onCreate方法的开头:

newHotels = new ArrayList<Hotel>(); 
+0

索引同样未初始化。如果这不仅仅是一个疏忽,我强烈建议你在处理Android之前阅读Java。 – RickNotFred

1

您可能还需要在使用前检查类别

String category = i.getStringExtra("category"); 

if(category.equals("hotels")) 

通知类别可以为空,所以你最好做类似的事情:

if(category != null && category.equals("hotels")) 
1

你可以在LogCat中找到你的错误, t包含你“知道”的类。例如,在您的LogCat中,有一行“at egypt.interfaceAct.locationFinder.onCreate(locationFinder.java:47)”

来自LogCat中的所有类,这是最为人熟知的类,因此您可以检查类locationFinder在第47行,找到第47行出了什么问题。

我假定您的列表newHotels仍为空。所以只是初始化newsHotels与

newHotels = new ArrayList<Hotel>(); 

中的onCreate

+0

Upvote用于解释您如何找到堆栈跟踪新手的答案。 – Josh