【问题标题】:Android app crashed when object is added to ArrayList<Object>将对象添加到 ArrayList<Object> 时,Android 应用程序崩溃
【发布时间】:2022-06-19 04:42:17
【问题描述】:

我是新手,如有任何错误,我深表歉意。

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

对象训练和练习看起来像这样

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

【问题讨论】:

  • 拜托,你能分享一下错误日志吗?
  • 我假设它是NullPointerExceptionTraining 的类定义未初始化 List&lt;Exercise&gt; exercises = new ArrayList&lt;&gt;(),因此您不能在代码中的该行 #add
  • 成功了!!在 for 循环修复它之前添加 List exercise = new ArrayList() 。非常感谢!

标签: java android android-studio arraylist add


【解决方案1】:

您的程序崩溃的原因是因为您在没有创建对象的情况下定义了一个引用(“练习”),然后您尝试使用该引用,尽管没有对象存在。在不创建对象的情况下,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&lt;&gt;() 创建一个实际列表,并将其分配给您的 exercises 引用,如下所示:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 2021-02-11
    • 2012-11-19
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多