有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在意图(可打包、可序列化)之间传输对象的ArrayList<T>会引发NullPointerException

在将泛型ArrayList传递给另一个活动时出现NullPointerException,但无法检测原因。也许有人在这个话题上对我有一些好的建议

我已经生成了1000个类型的对象(索引1-1000)。 ObjectsDEGR。类本身实现了可序列化接口和可打包接口

为了确保每个属性都已填充,我在开始时初始化了每个属性 对于0,因为NPE被抛出,如果属性缺少值,那么我可以检测到这一点

变量“类别”不同值的计算循环条件,如下表所示:

我已经通过方法中的setter初始化了对象的属性:

  • AllobjektsBasicInitialization()
  • 覆盖对象(整数类别)

之后,我通过writeToArrayList(int类别)方法提取1000个对象中的n=20个元素, 根据固有的优先级返回ArrayList:

  • 如果至少有一个属性为box=1的对象,则返回box=1的所有对象的列表
  • 如果没有box=1的对象,则返回box=2的所有对象的列表
  • 如果没有box=2的对象,则返回box=3的所有对象的列表

框始终是{1,2,3}中的一个值

后来,我想通过putExtra()将返回的ArrayList数据发送到另一个活动,然后 并使用getIntent()获取它们。getParcelableArrayListExtra

但是现在,仍然会抛出NPE,实际上objectsDEGR对象的属性已填充。 我在objectsDEGR中标记了一些属性。使用transient关键字初始化,因为我稍后只想在具有序列化的永久内存中写入非transient对象属性。 这就是我尝试使用界面的原因:Parceable

我读过,在一个包中写入通用数据是不可能的,所以在这种情况下,使用接口Parcelable传输通用ArrayList也不是一种有效的方法

我省略了方法createRandomPlaces(int category)(它有很多代码,我需要使代码更可读/更短)。如果没有可检测的原因,则故障可能在此方法内

我的主要活动类:

public class testActivity extends AppCompatActivity implements View.OnClickListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_degr);

    Button button1 = (Button) findViewById(R.id.button1);
    Button button2 = (Button) findViewById(R.id.button2);
    Button button3 = (Button) findViewById(R.id.button3);

    button1.setOnClickListener(this);
    button2.setOnClickListener(this);
    button3.setOnClickListener(this);
}

private int category;
public int getCategory() {
    return category;
}
public void setCategory(int category) {
    this.category = category;
}

int nV = 20;
public int getnV() {
    return nV;
}

int arraySIZE = 1000;

//+++++++++++ ARRAYINITIALISIERUNG ++++++++++

numbersCalculation[] randomNumbersArray = new numbersCalculation[getnV()];
ObjectsDEGR[] basicDEGR = new ObjectsDEGR[arraySIZE];

//+++++++++++++ METHODEN +++++++++++++++

private void allObjektsBasicInitialisation() {

    for (int g = 0; g < arraySIZE; g++) {

            basicDEGR[g] = new ObjectsDEGR(0,0,0,0,0,0,0,0, 0,0);
            basicDEGR[g].setVoc(getResources().getIdentifier("vocGR" + g, "string", getPackageName()));
            basicDEGR[g].setVocTR(getResources().getIdentifier("vocDE" + g, "string", getPackageName()));

            if (g==0){
            basicDEGR[g].setIndex(arraySIZE+1);}
            else {
                basicDEGR[g].setIndex(g);
            }

            basicDEGR[g].setBox(1);
    }
}

private void overwriteObjects(int category) {

    for (int r = ((category-1)*nV); r < nV+((category-1)*nV); r++) {
        basicDEGR[r].setVocR1(getResources().getIdentifier("vocGR" + randomNumbersArray[r- (category-1)*nV].getPlatz1(), "string", getPackageName()));
        basicDEGR[r].setVocF1(getResources().getIdentifier("vocGR" + randomNumbersArray[r- (category-1)*nV].getPlatz2(), "string", getPackageName()));
        basicDEGR[r].setVocF2(getResources().getIdentifier("vocGR" + randomNumbersArray[r- (category-1)*nV].getPlatz3(), "string", getPackageName()));
        basicDEGR[r].setVocF3(getResources().getIdentifier("vocGR" + randomNumbersArray[r- (category-1)*nV].getPlatz4(), "string", getPackageName()));
        basicDEGR[r].setVocF4(getResources().getIdentifier("vocGR" + randomNumbersArray[r- (category-1)*nV].getPlatz5(), "string", getPackageName()));
        basicDEGR[r].setVocF5(getResources().getIdentifier("vocGR" + randomNumbersArray[r- (category-1)*nV].getPlatz6(), "string", getPackageName()));
    }
}

public ArrayList<ObjectsDEGR> writeToArrayList(int category) {

    ArrayList<ObjectsDEGR> box1Filtered = new ArrayList<>();
    ArrayList<ObjectsDEGR> box2Filtered = new ArrayList<>();
    ArrayList<ObjectsDEGR> box3Filtered = new ArrayList<>();

    Integer comparer1 = 1;
    Integer comparer2 = 2;
    Integer comparer3 = 3;

    //region Implementierung
    for (int j = ((category-1)*nV); j < nV+((category-1)*nV); j++){

        if (comparer1.equals(basicDEGR[j].getBox())) {
            box1Filtered.add(basicDEGR[j]);
        }
        else if (comparer2.equals(basicDEGR[j].getBox())) {
            box2Filtered.add(basicDEGR[j]);
        }
        else if (comparer3.equals(basicDEGR[j].getBox())) {
            box3Filtered.add(basicDEGR[j]);
        }
        else {
            box3Filtered.add(basicDEGR[j]);
        }
    }//endregion

    if (box1Filtered.isEmpty())
    {
        if (box2Filtered.isEmpty()) {
            return box3Filtered;
        }
        else {
            return box2Filtered;
        }
    }
    else
    {
        return box1Filtered;
    }
}
private void createRandomPlaces(int category) {}

public void openVocDegrActivity(){
    Intent vocDEGR = new Intent (this, testVocActivity.class);

   vocDEGR.putExtra("CATEGORY", getCategory());
   vocDEGR.putExtra("NV", getnV());
   vocDEGR.putExtra("VOC_ARRAY", writeToArrayList(getCategory()));

    startActivity(vocDEGR);
}

@Override
public void onClick(View category) {

    Button button1 = (Button) findViewById(R.id.button1);
    Button button2 = (Button) findViewById(R.id.button2);
    Button button3 = (Button) findViewById(R.id.button3);

    button1.setOnClickListener(this);
    button2.setOnClickListener(this);
    button3.setOnClickListener(this);

    allObjektsBasicInitialisation();

    switch (category.getId()) {
        case R.id.button1:
            setCategory(1);
            createRandomPlaces(getCategory());
            overwriteObjects(getCategory());
            openVocDegrActivity();
            break;

        case R.id.button2:
            setCategory(2);
            createRandomPlaces(getCategory());
            overwriteObjects(getCategory());
            openVocDegrActivity();
            break;

        case R.id.button3:
            setCategory(3);
            createRandomPlaces(getCategory());
            overwriteObjects(getCategory());
            openVocDegrActivity();
            break;
    }
}}

接收者类别:

public class testVocActivity extends AppCompatActivity implements View.OnClickListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.voc_degr);

    //region Buttonimplementierung

    Button button1 = (Button) findViewById(R.id.button1);
    Button button2 = (Button) findViewById(R.id.button2);
    Button button3 = (Button) findViewById(R.id.button3);
    Button button4 = (Button) findViewById(R.id.button4);
    Button button5 = (Button) findViewById(R.id.button5);
    Button button6 = (Button) findViewById(R.id.button6);
    TextView tvVoc = (TextView) findViewById(R.id.tv_voc);
    Button button_weiter = (Button) findViewById(R.id.button_weiter);

    button1.setOnClickListener(this);
    button2.setOnClickListener(this);
    button3.setOnClickListener(this);
    button4.setOnClickListener(this);
    button5.setOnClickListener(this);
    button6.setOnClickListener(this);

    //endregion

} //end of onCreate()

// ++++++++++ INTENT INFORMATION TRANSFER +++++++

int nV = getIntent().getIntExtra("NV", 0);
int category = getIntent().getIntExtra("CATEGORY",0);

public ArrayList <ObjectsDEGR> intentGetter(){

    return getIntent().getParcelableArrayListExtra("VOC_ARRAY");
}

ArrayList <ObjectsDEGR> transferredItemsList = new ArrayList<>(intentGetter());
int numberOfEntries = intentGetter().size();

    @Override
public void onClick(View view) {

}}

对象类:

public class ObjectsDEGR implements Serializable, Parcelable {

private String voc;
private String vocTR;
private int index;
private Integer box;

private transient String vocR1;
private transient String vocF1;
private transient String vocF2;
private transient String vocF3;
private transient String vocF4;
private transient String vocF5;

//+++++++++++ KONSTRUKTOR +++++++++++++

public ObjectsDEGR(int voc, int vocTR, int index, int box, int vocR1, int vocF1, int vocF2, int vocF3, int vocF4, int vocF5){

    this.voc = Integer.toString(voc);
    this.vocTR = Integer.toString(vocTR);
    this.index = index;
    this.vocR1 = Integer.toString(vocR1);
    this.vocF1 = Integer.toString(vocF1);
    this.vocF2 = Integer.toString(vocF2);
    this.vocF3 = Integer.toString(vocF3);
    this.vocF4 = Integer.toString(vocF4);
    this.vocF5 = Integer.toString(vocF5);
    this.box = box;
}

protected ObjectsDEGR(Parcel in) {
    voc = in.readString();
    vocTR = in.readString();
    index = in.readInt();
    if (in.readByte() == 0) {
        box = null;
    } else {
        box = in.readInt();
    }
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(voc);
    dest.writeString(vocTR);
    dest.writeInt(index);
    if (box == null) {
        dest.writeByte((byte) 0);
    } else {
        dest.writeByte((byte) 1);
        dest.writeInt(box);
    }
}

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

public static final Creator<ObjectsDEGR> CREATOR = new Creator<ObjectsDEGR>() {
    @Override
    public ObjectsDEGR createFromParcel(Parcel in) {
        return new ObjectsDEGR(in);
    }

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

//+++++++++ GETTER +++++++++

public int getIndex(){
    return index;
}
public String getVoc() {
    return voc;
}
public String getVocTR(){
    return vocTR;
}
public String getVocR1() {
    return vocR1;
}
public String getVocF1() {
    return vocF1;
}
public String getVocF2() {
    return vocF2;
}
public String getVocF3() {
    return vocF3;
}
public String getVocF4() {
    return vocF4;
}
public String getVocF5() {
    return vocF5;
}
public int getBox(){
    return box;
}

//++++ SETTER +++++

public void setIndex(int index){
    this.index = index;
}
public void setVoc(int voc){
    this.voc = Integer.toString(voc);
}
public void setVocTR(int vocTR){
    this.vocTR = Integer.toString(vocTR);
}
public void setVocR1(int vocR1){
    this.vocR1 = Integer.toString(vocR1);
}
public void setVocF1(int vocF1){
    this.vocF1 = Integer.toString(vocF1);
}
public void setVocF2(int vocF2){
    this.vocF2 = Integer.toString(vocF2);
}
public void setVocF3(int vocF3){
    this.vocF3 = Integer.toString(vocF3);
}
public void setVocF4(int vocF4){
    this.vocF4 = Integer.toString(vocF4);
}
public void setVocF5(int vocF5){
    this.vocF5 = Integer.toString(vocF5);
}
public void setBox (int box){ this.box = box;}}

错误日志:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.doriandev.ganiu, PID: 22261
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.doriandev.ganiu/com.doriandev.ganiu.voc_degr_activity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int 安卓.content.Intent.getIntExtra(java.lang.String, int)' on a null object reference
    at 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:3194)
    at 安卓.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
    at 安卓.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
    at 安卓.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at 安卓.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at 安卓.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
    at 安卓.os.Handler.dispatchMessage(Handler.java:107)
    at 安卓.os.Looper.loop(Looper.java:214)
    at 安卓.app.ActivityThread.main(ActivityThread.java:7356)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.安卓.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
    at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:930)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int 安卓.content.Intent.getIntExtra(java.lang.String, int)' on a null object reference
    at com.doriandev.ganiu.voc_degr_activity.<init>(voc_degr_activity.java:65)
    at java.lang.Class.newInstance(Native Method)
    at 安卓.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95)
    at 安卓x.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45)
    at 安卓.app.Instrumentation.newActivity(Instrumentation.java:1243)
    at 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:3182)
    at 安卓.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) 
    at 安卓.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
    at 安卓.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
    at 安卓.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
    at 安卓.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 
    at 安卓.os.Handler.dispatchMessage(Handler.java:107) 
    at 安卓.os.Looper.loop(Looper.java:214) 
    at 安卓.app.ActivityThread.main(ActivityThread.java:7356) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.安卓.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
    at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:930) 

共 (1) 个答案

  1. # 1 楼答案

    好的,最好将功能组合到一个活动中,并构建更像导航菜单(具有自己的用户界面)的中间活动。此中间活动仅将int参数(category)传递给下游活动,该参数在onClick()方法中由setter覆盖。最后,完整的对象创建和永久数据存储在这个活动中进行,而不需要在活动之间传递整个1000个对象。这需要对代码进行重新设计,但使其更容易

    谢谢你的意见