删除方法,从对象数组中删除对象

时间:2018-03-29 19:22:04

标签: java methods foreach nullpointerexception

所以我有一个班级Pizza

public class Pizza{

private final int MAX_INGREDIENTS = 5;
private int id;
private String name;
private String description;
private float price;
private PizzaSize size;
private PizzaIngredients[] ingredients;
private int numberOfIngredients;
}

正如您所看到的,我有一个与此问题无关的枚举PizzaSize

我还有Ingredients课程:

public class Ingredients {

private int id;
private String name;
private MeasurementUnits measurementUnits;
private int calories;
}

正如您所看到的,我有一个与此问题无关的枚举MeasurementUnits

最后,我有一个PizzaIngredients课程:

public class PizzaIngredients {

private Ingredients ingredients;
private float quantity;
}

所有这些类都有各自的构造方法和所有的Setter和Getters,以节省空间并增强清晰度,我选择不将它们放在这里。

所以我写了这个方法,用ID来从成分集合中去除成分:

public void removeIngredient(int id) {

if (this.numberOfIngredients > 0) {
    for(int i = 0; i < this.ingredients.length; i++) {
       if (this.ingredients[i] != null && this.ingredients[i].getIngredients().getId() == id) {
          ingredients[i] = null;
       }
    } else {
        System.out.println("Pizza has no ingredients!");
    }
}    

但是现在我正在尝试使用i而不使用和索引foreach来编写方法:

    if (this.numberOfIngredients > 0) {
        for (PizzaIngredients ing : this.ingredients) {
            if (ing.getIngredients().getId() == id) {
               ing.setIngredients(null);
            }
        }
    } else {
        System.out.println("Pizza has no ingredients!");
    }

此方法将成分设置为null,但在打印时,

    pizza1.removeIngredient(1);
    System.out.println("Removing ingredient test (pizza1): ");
    for (PizzaIngredients ingredient : collection1) {
        if (ingredient != null) {
            System.out.println("ID: " + ingredient.getIngredients().getId() + "| Name: " + ingredient.getIngredients().getName()
                    + "| Quantity: " + ingredient.getQuantity() + " " + ingredient.getIngredients().getMeasurementUnits());
        }
    }

抛出NullPointerException,而使用带有索引的方法却没有。为什么会这样?将第二种方法条件更改为ing = null时,它甚至不起作用,它仍会打印该成分。

1 个答案:

答案 0 :(得分:3)

你得到NullPointerException,因为你仍然试图访问PizzaIngredient中你已设置为null的成分。

所以你将Ingredient设置为null,这里:

ing.setIngredients(null);

但是你试图在你的system.out中访问相同的null Ingredient,这里:

ingredient.getIngredients().getId()

您应该将if语句更改为:

if (ingredient.getIngredients() != null) {
相关问题