所以我有一个班级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
时,它甚至不起作用,它仍会打印该成分。
答案 0 :(得分:3)
你得到NullPointerException,因为你仍然试图访问PizzaIngredient中你已设置为null的成分。
所以你将Ingredient设置为null,这里:
ing.setIngredients(null);
但是你试图在你的system.out中访问相同的null Ingredient,这里:
ingredient.getIngredients().getId()
您应该将if语句更改为:
if (ingredient.getIngredients() != null) {