Исключение нулевого указателя при использовании Parcelable - PullRequest
0 голосов
/ 25 марта 2011

Я создал java-класс 'store', в котором просто хранятся значения, которые я передаю через 2 счетчика и один текст редактирования ... Я передаю объект этого класса с помощью parcelable промежуточному классу Spinpizza.java, за которым следует Bill.java.... Это показывает правильный вывод до SpinPizza .. (отображает значения, введенные через spinner n edittext), но это дает ИСКЛЮЧЕНИЕ NULL POINTER В Bill.java :-( Пожалуйста, помогите мне ... Я застрял с этим более4 дня ..

Вот мой код ...

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));
     }}
}

Ответы [ 3 ]

5 голосов
/ 25 марта 2011

Хорошо, если эта строка выдает исключение:

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

Тогда параметры:

  • b равно нулю (определенно нет; ему присвоено ненулевое значение в предыдущей строке)
  • B равно нулю
  • B[i] равно нулю

Мои деньги на последнем. Вот как вы инициализируете массив:

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

Есть что сказать, что getParcelable не вернет ноль?

Из документации для Bundle.getParcelable():

Возвращает значение, связанное с данным ключом, или ноль, если для данного ключа не существует сопоставления нужного типа или нулевое значение явно связано с ключом.

Так что я думаю, что getParcelable возвращает ноль. Теперь вам нужно выяснить почему и исправить это. Я бы также предложил использовать более обычные и описательные имена для ваших классов и переменных.

0 голосов
/ 07 октября 2018

Действительно очень старый вопрос, но я попал сюда в 2018 году с помощью простого поиска и использую Kotlin, поэтому собираюсь ответить на него в будущем.

на самом деле вы не можете делать кардиостимуляцию в полях final \ val, так как интерфейс Parcelable не может записывать и перезаписывать значения в нем, либо отбрасывать поля final \ val, либо не включать их в сценарии распределения .

0 голосов
/ 05 июня 2015

Этот пост старый, но самая распространенная проблема здесь - реализация интерфейса Parcelable для вашего класса, а затем касание полей и методов, что может потребовать от вас повторной реализации интерфейса Parcelable или просто добавить отсутствующий.

Я рекомендую установить плагин Parcelable для Android Studio или Eclipse и воссоздать плиту котла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...