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