2011-03-25 171 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插件并重新创建锅炉板。