getParcelable空指针异常

时间:2013-12-17 13:51:35

标签: android

我遇到了Bundle parcelable(NullPointerException)的问题:

日志:

12-17 12:32:18.000: D/dalvikvm(6077): WAIT_FOR_CONCURRENT_GC blocked 8ms
12-17 12:32:18.025: I/ServiceUtil(6077): Połączono z serwisem
12-17 12:32:18.025: I/MYSTERIOUSPOLAND(6077): Parcel
12-17 12:32:18.025: D/AndroidRuntime(6077): Shutting down VM
12-17 12:32:18.025: W/dalvikvm(6077): threadid=1: thread exiting with uncaught exception (group=0x413582a0)
12-17 12:32:18.030: E/AndroidRuntime(6077): FATAL EXCEPTION: main
12-17 12:32:18.030: E/AndroidRuntime(6077): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mysteriouspoland/com.example.mysteriouspoland.OpisMiejscaActivity}: java.lang.NullPointerException
12-17 12:32:18.030: E/AndroidRuntime(6077):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2100)
12-17 12:32:18.030: E/AndroidRuntime(6077):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125)
12-17 12:32:18.030: E/AndroidRuntime(6077):     at android.app.ActivityThread.access$600(ActivityThread.java:140)
12-17 12:32:18.030: E/AndroidRuntime(6077):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227)
12-17 12:32:18.030: E/AndroidRuntime(6077):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-17 12:32:18.030: E/AndroidRuntime(6077):     at android.os.Looper.loop(Looper.java:137)
12-17 12:32:18.030: E/AndroidRuntime(6077):     at android.app.ActivityThread.main(ActivityThread.java:4898)
12-17 12:32:18.030: E/AndroidRuntime(6077):     at java.lang.reflect.Method.invokeNative(Native Method)
12-17 12:32:18.030: E/AndroidRuntime(6077):     at java.lang.reflect.Method.invoke(Method.java:511)
12-17 12:32:18.030: E/AndroidRuntime(6077):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
12-17 12:32:18.030: E/AndroidRuntime(6077):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
12-17 12:32:18.030: E/AndroidRuntime(6077):     at dalvik.system.NativeStart.main(Native Method)
12-17 12:32:18.030: E/AndroidRuntime(6077): Caused by: java.lang.NullPointerException
12-17 12:32:18.030: E/AndroidRuntime(6077):     at com.example.mysteriouspoland.OpisMiejscaActivity.display(OpisMiejscaActivity.java:79)
12-17 12:32:18.030: E/AndroidRuntime(6077):     at com.example.mysteriouspoland.OpisMiejscaActivity.onCreate(OpisMiejscaActivity.java:57)
12-17 12:32:18.030: E/AndroidRuntime(6077):     at android.app.Activity.performCreate(Activity.java:5206)
12-17 12:32:18.030: E/AndroidRuntime(6077):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1083)
12-17 12:32:18.030: E/AndroidRuntime(6077):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2064)
12-17 12:32:18.030: E/AndroidRuntime(6077):     ... 11 more

OpisMiejscaActivity:

public class OpisMiejscaActivity extends FragmentActivity 
{

    Miejsce zMiejsce;
    boolean mShowMap;
    GoogleMap zMap;
    private ImageView imgView;


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

        setContentView(R.layout.opis_miejsca_activity);

        getActionBar().setDisplayHomeAsUpEnabled(true);

        //      
        mShowMap = GooglePlayServiceUtility.isPlayServiceAvailable(this) && initMap();

        Bundle b = getIntent().getExtras();
        zMiejsce = b.getParcelable(".model.Miejsce");

        display();

    }

    //
    private boolean initMap() 
    {
        // TODO Auto-generated method stub
        if(zMap == null)
        {
            SupportMapFragment fm = (SupportMapFragment)  getSupportFragmentManager().findFragmentById(R.id.map);
            zMap = fm.getMap();
//          MapFragment mapFrag = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
//          zMap = mapFrag.getMap(); 
        }
        return (zMap != null);
    }

    private void display() 
    {

        TextView tv = (TextView) findViewById(R.id.titleText);
        tv.setText(zMiejsce.getTytul1());


        NumberFormat nf = NumberFormat.getCurrencyInstance();
        tv = (TextView) findViewById(R.id.priceText);
        tv.setText(nf.format(zMiejsce.getKoszt()));

        tv = (TextView) findViewById(R.id.descText);
        tv.setText(zMiejsce.getOpis());

        //imgView = (ImageView) findViewById(R.id.imageView1);
        //imgView.setImageResource(R.drawable.map_whitney);

        //imgView.setImageBitmap(BitmapFactory.decodeFile(zMiejsce.getImage()));
        /*imgView = (ImageView) findViewById(R.id.imageView1);
        imgView.setImageBitmap(BitmapFactory.decodeFile(zMiejsce.getImage()));
        */
        //
        if (mShowMap)
        {
            CameraUpdate update = CameraUpdateFactory.newLatLngZoom(zMiejsce.getLatLng(), 5);
            zMap.moveCamera(update);
        }

        /*SupportMapFragment fm = (SupportMapFragment)  getSupportFragmentManager().findFragmentById(R.id.map);
        GoogleMap zMap = fm.getMap();*/ 

    }

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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.menu_goto_action :
//          Go to external mapping app
            sendToActionIntent();
            break;
        case android.R.id.home:
//          User pressed the 'Up' button on the action bar
            finish();
            break;
        }
        return false;
    }
}

在我看来,OpisMiejscaActivity中的片段有问题:

Bundle b = getIntent().getExtras();
zMiejsce = b.getParcelable(".model.Miejsce");

display();

也许钥匙有问题?

Miejsce:

public class Miejsce implements Parcelable 
{
    private long identyfikator;
    private String miasto;
    private String tytul1;
    private String tytul2;
    private String opis;
    private String marker = "";
    private double koszt;
    private double poziomTrudnosci;
    private String image;
    private double latitude = 51.108342;
    private double longitude = 17.060831;

    private static String LOGTAG = "MYSTERIOUSPOLAND";

    public Miejsce() 
    {

    }

    public Miejsce(Parcel in) 
    {
        Log.i(LOGTAG, "Parcel");

        identyfikator = in.readLong();
        miasto = in.readString();
        tytul1 = in.readString();
        tytul2 = in.readString();
        koszt = in.readDouble();
        poziomTrudnosci = in.readDouble();
        image = in.readString();
        latitude = in.readDouble();
        longitude = in.readDouble();
        marker = in.readString();
    }

    public long getIdentyfikator() 
    {
        return identyfikator;
    }

    public void setIdentyfikator(long identyfikator) 
    {
        this.identyfikator = identyfikator;
    }

    public String getMiasto() 
    {
        return miasto;
    }

    public void setMiasto(String miasto) 
    {
        this.miasto = miasto;
    }

    public String getTytul1() 
    {
        return tytul1;
    }

    public void setTytul1(String tytul1) 
    {
        this.tytul1 = tytul1;
    }

    public String getTytul2() 
    {
        return tytul2;
    }

    public void setTytul2(String tytul2) 
    {
        this.tytul2 = tytul2;
    }

    public String getOpis() 
    {
        return opis;
    }

    public void setOpis(String opis) 
    {
        this.opis = opis;
    }

    public double getKoszt() 
    {
        return koszt;
    }

    public void setKoszt(double koszt) 
    {
        this.koszt = koszt;
    }

    public double getPoziomTrudnosci() 
    {
        return poziomTrudnosci;
    }

    public void setPoziomTrudnosci(double poziomTrudnosci) 
    {
        this.poziomTrudnosci = poziomTrudnosci;
    }

    public String getImage() 
    {
        return image;
    }

    public void setImage(String image) 
    {
        this.image = image;
    }

    public double getLatitude() 
    {
        return latitude;
    }

    public void setLatitude(double latitude) 
    {
        this.latitude = latitude;
    }

    public double getLongitude() 
    {
        return longitude;
    }

    public void setLongitude(double longitude) 
    {
        this.longitude = longitude;
    }

    public String getMarker() 
    {
        return marker;
    }

    public void setMarker(String marker) 
    {
        this.marker = marker;
    }

    @Override
    public String toString() 
    {
        NumberFormat nf = NumberFormat.getCurrencyInstance();
        return tytul1 + "\n(" + nf.format(koszt) + ")";
    }


    public LatLng getLatLng() 
    {
        LatLng latLng = new LatLng(latitude, longitude);
        return latLng;
    }

    @Override
    public int describeContents() 
    {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) 
    {
        dest.writeLong(identyfikator);
        dest.writeString(miasto);
        dest.writeString(tytul1);
        dest.writeString(tytul2);
        dest.writeString(opis);
        dest.writeDouble(koszt);
        dest.writeDouble(poziomTrudnosci);
        dest.writeString(image);
        dest.writeDouble(latitude);
        dest.writeDouble(longitude);
        dest.writeString(marker);
    }

    public static final Parcelable.Creator<Miejsce> CREATOR = new Parcelable.Creator<Miejsce>() 
    {

        @Override
        public Miejsce createFromParcel(Parcel source) 
        {
            return new Miejsce(source);
        }

        @Override
        public Miejsce[] newArray(int size) 
        {
            return new Miejsce[size];
        }

    };

}

1 个答案:

答案 0 :(得分:0)

您可以通过执行b.hasKey(“。model.Miejsce”)确保捆绑包具有该条目;