[英]Android app crashed when object is added to ArrayList<Object>
我是新手,因此對任何錯誤表示歉意。
背景:作為 object 培訓的一部分,我正在嘗試添加 object 練習的 arraylist。 然而。 每次我嘗試將 object 練習添加到訓練的 Arraylist 時,應用程序都會崩潰。 歡迎任何幫助。
對象訓練和鍛煉看起來像這樣
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;
}
您的程序崩潰的原因是因為您在沒有創建 object 的情況下定義了一個引用(“練習”),然后您嘗試使用該引用,盡管沒有 object 存在。 在不創建 object 的情況下, 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
) 而不是具體的 class ( ArrayList
) 來聲明exercises
。 使用接口而不是具體類來定義變量是一種很好的做法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.