代码之家  ›  专栏  ›  技术社区  ›  ramireeez

Remove方法,从对象数组中移除对象

  •  0
  • ramireeez  · 技术社区  · 7 年前

    所以我有一节课 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和getter,为了节省空间和增强清晰度,我选择不将它们放在这里。

    所以我写了这个方法,通过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!");
        }
    }    
    

    但现在我正在尝试编写不使用and索引的方法 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 回复  |  直到 7 年前
        1
  •  3
  •   dev4life    7 年前

    您会得到NullPointerException,因为您仍在尝试访问PizzaComponent中的配料,您已将其设置为null。

    因此,您正在将配料设置为null,如下所示:

    ing.setIngredients(null);
    

    但您正试图访问系统中相同的空成分。出去,这里:

    ingredient.getIngredients().getId()
    

    您应该将if语句更改为:

    if (ingredient.getIngredients() != null) {