2012-05-25 2 views
0

Моя программа вызывает исключение с помощью null-указателя ... Я думаю, что проблема заключается в преобразовании lat3 и lon3 из double в int ... Есть ли другой способ разбора местоположения в double to int, чтобы передать его GeoPoint?В программе отображается исключение null-указателя .... преобразование double в int

Код:

public class mapLoc extends com.google.android.maps.MapActivity implements LocationListener 
{ 
    TextView t ; 
    int lat2,lon2,lat3,lon3; 
    Double presentlon,presentlat; 

    Drawable d; 
    MapView mv; 
    MapController mc; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 

     super.onCreate(savedInstanceState); 

     setContentView(R.layout.map); 

     t = (TextView)findViewById(R.id.maptxt); 

     Intent intent = getIntent(); 
     Bundle extra = intent.getExtras(); 

    String latitude = extra.getString("latitude"); 
    String longitude = extra.getString("longitude"); 

    t.append(latitude+"\t"); 
    t.append(longitude); 
    Float lat1 = Float.parseFloat(latitude); 
    Float lon1 = Float.parseFloat(longitude); 
     lat2 = (int) (lat1*1E6); 
     lon2 = (int) (lon1*1E6); 


     mv = (MapView)findViewById(R.id.maps); 

     mc = mv.getController(); 
     mc.setZoom(14); 
     mv.setBuiltInZoomControls(true); 
     mv.displayZoomControls(true); 
     mv.setClickable(true); 


    List<Overlay> mapOverlays = mv.getOverlays(); 
    Drawable drawable = this.getResources().getDrawable(R.drawable.marker); 
    overlay itemizedoverlay = new overlay(drawable, this); 

    lat3 = (int)(presentlat * 1E6); 
    lon3 = (int)(presentlon * 1E6); 


    GeoPoint point = new GeoPoint(lat3, lon3); 

    OverlayItem overlayitem = new OverlayItem(point, "Hello, user", "This is your present location"); 
    mc.animateTo(point); 

    itemizedoverlay.addOverlay(overlayitem); 
    mapOverlays.add(itemizedoverlay); 

    GeoPoint point2 = new GeoPoint(lat2, lon2); 
    OverlayItem overlayitem2 = new OverlayItem(point2, "This is your","saved location"); 
    itemizedoverlay.addOverlay(overlayitem2); 
    mapOverlays.add(itemizedoverlay); 



    } 


    @Override 
    public void onLocationChanged(Location location) 
    { 
    presentlat = location.getLatitude(); 
    presentlon = location.getLongitude(); 

    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     // TODO Auto-generated method stub 

    } 


    @Override 
    protected boolean isRouteDisplayed() { 
     // TODO Auto-generated method stub 
     return false; 
    }; 



} 

Logcat ошибки:

05-25 10:21:52.444: W/dalvikvm(342): threadid=3: thread exiting with uncaught exception (group=0x4001b188) 
05-25 10:21:52.444: E/AndroidRuntime(342): Uncaught handler: thread main exiting due to uncaught exception 
05-25 10:21:52.454: E/AndroidRuntime(342): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.loc/com.loc.mapLoc}: java.lang.NullPointerException 
05-25 10:21:52.454: E/AndroidRuntime(342): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496) 
05-25 10:21:52.454: E/AndroidRuntime(342): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 
05-25 10:21:52.454: E/AndroidRuntime(342): at android.app.ActivityThread.access$2200(ActivityThread.java:119) 
05-25 10:21:52.454: E/AndroidRuntime(342): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 
05-25 10:21:52.454: E/AndroidRuntime(342): at android.os.Handler.dispatchMessage(Handler.java:99) 
05-25 10:21:52.454: E/AndroidRuntime(342): at android.os.Looper.loop(Looper.java:123) 
05-25 10:21:52.454: E/AndroidRuntime(342): at android.app.ActivityThread.main(ActivityThread.java:4363) 
05-25 10:21:52.454: E/AndroidRuntime(342): at java.lang.reflect.Method.invokeNative(Native Method) 
05-25 10:21:52.454: E/AndroidRuntime(342): at java.lang.reflect.Method.invoke(Method.java:521) 
05-25 10:21:52.454: E/AndroidRuntime(342): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
05-25 10:21:52.454: E/AndroidRuntime(342): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
05-25 10:21:52.454: E/AndroidRuntime(342): at dalvik.system.NativeStart.main(Native Method) 
05-25 10:21:52.454: E/AndroidRuntime(342): Caused by: java.lang.NullPointerException 
05-25 10:21:52.454: E/AndroidRuntime(342): at com.loc.mapLoc.onCreate(mapLoc.java:71) 
05-25 10:21:52.454: E/AndroidRuntime(342): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
05-25 10:21:52.454: E/AndroidRuntime(342): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459) 

ответ

1

В фрагменте кода я не думаю, что эти presentlat и presentlon становятся инициализирован и, следовательно, бросая NPE.

lat3 = (int)(presentlat * 1E6); // NPE 
lon3 = (int)(presentlon * 1E6); 

Либо их инициализировать перед использованием, либо иметь нулевую проверку.

0

Вы правы, ваше приложение взрывается, потому что presentlat и presentlon являются частными переменными, которые не были инициализированы. Вы должны переместить этот код в свою функцию onLocationChanged.

1

Имейте в виду, что Double (капитал D) не примитивный тип, а ссылочный тип, который происходит, чтобы иметь возможность проводить только в штучной упаковке double (обратите внимание на разницу) значения - или null. Язык Java не обрабатывает unboxing иначе, чем другие обращения к объектам через ссылку. Если ссылка null (что здесь, очевидно, имеет место здесь), это вызовет NPE. Реальная разница с распаковкой заключается в том, что такой доступ происходит неявно через что-то вроде ref.doubleValue(), когда вы используете ссылку в арифметических выражениях.