2011-03-25 169 views
0

我做了一個java類'商店',它存儲了我通過2個spinners n一個edittext給出的值...我使用parcelable將該類的對象傳遞給中間類Spinpizza。 java後面跟着Bill.java ....它顯示出正確的輸出直到SpinPizza ..(顯示通過spinner n edittext輸入的值),但它給了Bill.java中的NULL POINTER EXCEPTION :-(請幫助我...我米堅持這一超過4天數。使用Parcelable時空指針異常

這裏是我的代碼...

Store.java

package com.Lak; 

import android.os.Parcel; 
import android.os.Parcelable; 


public class store implements Parcelable { 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    private String pizzaname; 
    private String pizzasize; 
    private int n; 
    public void setOrder(String name,String size,int qty) 
    { 
     pizzaname = name; 
     pizzasize = size; 
     n = qty; 
    } 
    public String getPizzaName() 
    { 
     return pizzaname; 

    } 

    public int getQuantity() 

    {return n;} 
    public String getPizzaSize() { 
     // TODO Auto-generated method stub 
     return pizzasize; 
    } 
    public int describeContents() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @SuppressWarnings("rawtypes") 
    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { 
      public store createFromParcel(Parcel in) { 
       return new store(in); 
      } 

      public store[] newArray(int size) { 
       return new store[size]; 
      } 
     }; 

    public void writeToParcel(Parcel dest, int flags) { 

      dest.writeInt(n); 
      dest.writeString(pizzaname); 
      dest.writeString(pizzasize); 
    } 


    public store() 

    {} 
     public store(Parcel source){ 
      /* 
      * Reconstruct from the Parcel 
      */ 

      n = source.readInt(); 
      pizzaname = source.readString(); 
      pizzasize = source.readString(); 

    } 


    /** Called when the activity is first created. */ 
} 

(SpinPizza.java)

package com.Lak; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.view.View; 
import android.view.View.OnKeyListener; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Spinner; 
import android.widget.TextView; 
import android.widget.Toast; 

public class SpinPizza extends Activity{ 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    store B[]= new store[10]; 


    Spinner s=null,s1=null; 
    EditText edittext=null; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.drop); 


     s = (Spinner) findViewById(R.id.spinner); 

     ArrayAdapter<?> adapter = ArrayAdapter.createFromResource(
       this, R.array.pizzaarray, android.R.layout.simple_spinner_item); 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     s.setAdapter(adapter); 


     s1 = (Spinner) findViewById(R.id.spinner1); 
     ArrayAdapter<?> adapter1 = ArrayAdapter.createFromResource(
       this, R.array.sizearray, android.R.layout.simple_spinner_item); 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     s1.setAdapter(adapter1); 

     edittext = (EditText) findViewById(R.id.edittext); 
     edittext.setOnKeyListener(new OnKeyListener() { 
      public boolean onKey(View v, int keyCode, KeyEvent event) { 
       // If the event is a key-down event on the "enter" button 
       if ((event.getAction() == KeyEvent.ACTION_DOWN) && 
        (keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_DPAD_CENTER)) { 
        // Perform action on key press 
        int i=0; 

        B[i]=new store(); 
         int n=Integer.parseInt(edittext.getText().toString()); 
      B[i].setOrder(s.getSelectedItem().toString(), s1.getSelectedItem().toString(),n); 

        TextView objText=(TextView) findViewById(R.id.pl); 
        TextView objText1=(TextView) findViewById(R.id.pl2); 
        objText.setText(B[i].getPizzaName()); 
        objText1.setText(B[i].getPizzaSize()); 
        i++; 

        Toast.makeText(SpinPizza.this, edittext.getText(), Toast.LENGTH_SHORT).show(); 
        return true; 
       } 
       return false; 
      } 
     }); 


      Button next1 = (Button) findViewById(R.id.bill); 

      next1.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View view) { 

        Intent myIntent = new Intent(view.getContext(), Bill.class); 

        for(int i =0;i<B.length;i++) 
        { 
         myIntent.putExtra("myclass"+i,B[i]); 
        } 
        myIntent.putExtra("length",B.length); 
        startActivityForResult(myIntent, 0); 

       } 

      }); 

    } 
} 

(Bill.java)

package com.Lak; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.ViewGroup.LayoutParams; 
import android.widget.TableLayout; 
import android.widget.TableRow; 
import android.widget.TextView; 

public class Bill extends Activity { 
    @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

    this.setContentView(R.layout.calc); 
    store B[] = new store[10]; 
    Bundle bj=getIntent().getExtras(); 
    int length = bj.getInt("length"); 
    for(int i = 0 ;i<length;i++) 
    { 
     B[i] = (store)bj.getParcelable("myClass"+i); 
    } 
// B = (store[]) bj.get("myClass"); 

    /* Find Tablelayout defined in main.xml */ 
    TableLayout tl = (TableLayout)findViewById(R.id.myTable); 
     /* Create a new row to be added. */ 
     TableRow tr = new TableRow(this); 
     tr.setLayoutParams(new LayoutParams(
         LayoutParams.FILL_PARENT, 
         LayoutParams.WRAP_CONTENT)); 

       /* Create TEXTVIEWS to be the row-content. */ 
      for(int i=0;i<length;i++) 
      { TextView b = new TextView(this); 
      b.setText(B[i].getPizzaName()); // NULL POINTER EXCEPTION :(

      TextView b1 = new TextView(this); 
      b1.setText(B[i].getPizzaSize()); 

      TextView b2 = new TextView(this); 
      b2.setText(B[i].getQuantity()); 

      b.setLayoutParams(new LayoutParams(
         LayoutParams.FILL_PARENT, 
         LayoutParams.WRAP_CONTENT)); 

      b1.setLayoutParams(new LayoutParams(
        LayoutParams.FILL_PARENT, 
        LayoutParams.WRAP_CONTENT)); 

      b2.setLayoutParams(new LayoutParams(
        LayoutParams.FILL_PARENT, 
        LayoutParams.WRAP_CONTENT)); 

      /* Add TextViews to row. */ 
       tr.addView(b); 

       tr.addView(b1); 

       tr.addView(b2); 


    /* Add row to TableLayout. */ 
    tl.addView(tr,new TableLayout.LayoutParams(
       LayoutParams.FILL_PARENT, 
       LayoutParams.WRAP_CONTENT)); 
    }} 
} 
+0

哪一行發生這種情況? – Argote 2011-03-25 16:55:43

+0

是可用的堆棧跟蹤? – aldrin 2011-03-25 17:24:24

+0

@Argote:這裏 - > b.setText(B [i] .getPizzaName()); – 2011-03-25 18:41:20

回答

5

好吧,如果這條線拋出異常:

b.setText(B[i].getPizzaName()); 

然後選項有:

  • b爲空(絕對不是;它的前行指定一個非空值)
  • B是空
  • B[i]是空

我的錢是在最後一個。這裏是你如何初始化數組:

for(int i = 0 ;i<length;i++) 
{ 
    B[i] = (store)bj.getParcelable("myClass"+i); 
} 

有什麼說getParcelable不會返回null?

documentation for Bundle.getParcelable()

如果沒有所需類型的映射存在給定鍵或空值被明確地與該鍵關聯返回與給定鍵相關聯的值,或爲空。

所以我的猜測是,getParcelable被返回null。現在你需要找出原因並加以解決。我還建議爲你的類和變量使用更多的傳統和描述性名稱。

+0

謝謝你的建議。我一直在努力getParcelable()在過去的幾天,但我不知道我在哪裏徘徊..有人請修復它...我已經給所有的代碼... – 2011-03-25 18:22:01

+2

@ user677124:不,這不是這樣作品。你不會說,「這是所有的代碼,請現在修復它。「你解釋了你已經嘗試過的東西,把它分解成儘可能小的例子,等等。 – 2011-03-25 18:24:46

+0

哦,我很抱歉,看到我覺得getParcelable(),null指針異常會出現在同一行......但它出現在我提到的行中......所以我猜getParcelable()可能工作正常..但是然後我想知道getPizzaName()如何在這裏給出null值在SpinPizza.java中工作得很好 – 2011-03-25 18:31:08

0

這篇文章很舊,但最常見的問題是爲您的類實現Parcelable接口,然後觸摸字段和方法,這可能需要您重新實現Parcelable接口或僅添加缺少的接口。

我建議你安裝Android Studio或Eclipse的Parcelable插件並重新創建鍋爐板。