将对象添加到 ArrayList <Object>时 Android 应用程序崩溃



我是新手,因此对任何错误表示歉意。

上下文:作为对象训练的一部分,我试图添加一个对象练习的数组列表。然而每次我试图将对象Exercise添加到训练数组列表中时,应用程序都会崩溃。欢迎任何帮助。

对象训练和锻炼看起来像这个

public class Training {
public Integer trainingNumber;
public Date datum;
public Integer nrOfExercises;
public ArrayList<Exercise> exercises;
}
public class Training {
public Integer trainingNumber;
public Date datum;
public Integer nrOfExercises;
public ArrayList<Exercise> exercises;
}

试图生成这一切的代码如下:

private Training createRandomTraining(int i){
Training randomTraining = new Training();
Random random = new Random();
int d = random.nextInt(30)+1;
int m = random.nextInt(12)+1;
//int y = random.nextInt(21)+2000;
int amountOfExercises = random.nextInt(9-6)+6;
randomTraining.trainingNumber = i;
randomTraining.datum = new Date(2021,m,d);
for (int j = 0; j < amountOfExercises ; j ++){
Exercise exercise = new Exercise();
Random r = new Random();
int set = r.nextInt(5)+1;
int nameInt = r.nextInt(3);
int rep = r.nextInt(12)+1;
//int y = random.nextInt(21)+2000;
exercise.trainingNumber = i;
exercise.exerciseNumber = j+1;
exercise.exerciseName = getExerciseName(nameInt);
exercise.sets = set;
exercise.reps = rep;
exercise.weight = random.nextInt(200-50)+50;
randomTraining.exercises.add(exercise); //the app crashes here.   //The other parts work fine.
}
randomTraining.nrOfExercises = amountOfExercises;
return randomTraining;
}

程序崩溃的原因是您在没有创建对象的情况下定义了引用("练习"(,然后尽管没有对象,但仍试图使用该引用。在不创建对象的情况下,exercises的值为null,对null引用调用.add()将抛出NullPointerException

这里有一个非常简单的例子,编译器会标记它(不需要运行程序来检测错误(:

String s;
int l = s.length();

如果您编译该代码,您应该会看到这样的编译错误:

ReferenceWithoutObject.java:11: error: variable s might not have been initialized
int l = s.length();
^
1 error

您的示例也做同样的事情,尽管它涉及一些类,因此编译器不会检测到错误。以下是您正在做的事情的一个简单版本,它编译得很好:

import java.util.List;
public class ReferenceWithoutObject {
public static void main(String[] args) {
Training training = new Training();
training.exercises.add(new Exercise());
}
}
class Training {
public List<Exercise> exercises;
}
class Exercise {
}

如果你运行该代码,它会产生以下错误:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.util.List.add(Object)" because "training.exercises" is null
at ReferenceWithoutObject.main(ReferenceWithoutObject.java:6)

有几种方法可以解决这个问题,但有一种简单的方法:使用new ArrayList<>()创建一个实际的列表,并将其分配给exercises引用,如下所示:

class Training {
public List<Exercise> exercises = new ArrayList<>();
}

此外,您会注意到,我修改了代码以定义public List<Exercise> exercises而不是public ArrayList<Exercise> exercises——也就是说,使用接口(List(而不是具体类(ArrayList(来声明exercises。使用接口而不是具体类来定义变量是一种很好的做法。

最新更新