#java
#java
Вопрос:
Я пытаюсь написать небольшой код на Java. Я получаю сообщение об ошибке от метода getTotalCost(). не могли бы вы, пожалуйста, проверить мой код и указать, какую ошибку я делаю.
Я создаю класс Hamburger . передаю 3 переменные в consutuctor. тогда я выбираю добавить помидор или шпинат в свой бургер. В моем getTotalCost() я пытаюсь вывести значение, если myLettuce.
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "com.amitsuneja.Lettuce.getCostOfLettuce()" because "this.myLettuce" is null at com.amitsuneja.Hamburger.getTotalCost(Hamburger.java:77) at com.amitsuneja.Main.main(Main.java:8)
Вот мой Hamburger.java
public class Hamburger {
private String breadType;
private boolean isMeat;
private double priceOfBurger;
private Lettuce myLettuce;
private boolean addLettuce;
private Tomato myTomato;
private boolean addTomato;
private Carrot myCarrot;
private boolean addCarrot;
private Spinach mySpinach;
private boolean addSpinach;
private double toalCost;
Scanner myScanner = new Scanner(System.in);
public Hamburger(String breadType, boolean isMeat, double priceOfBurger) {
this.breadType = breadType;
this.isMeat = isMeat;
this.priceOfBurger = priceOfBurger;
System.out.println("Current cost of burger is: " this.priceOfBurger);
System.out.println(" Would like to add some Lettuce?");
addLettuce = myScanner.nextBoolean();
if (addLettuce){
Lettuce myLettuce1 = new Lettuce(true);
}else{
Lettuce myLettuce1 = new Lettuce(false);
System.out.println("I am in Lettuce: " myLettuce.getCostOfLettuce() myLettuce.isHaveLettuce());
}
myScanner.nextLine();
System.out.println(" Would like to add some Tomato?");
addTomato = myScanner.nextBoolean();
if (addTomato){
Tomato myTomato = new Tomato(true);
}else{
Tomato myTomato = new Tomato(false);
}
myScanner.nextLine();
System.out.println(" Would like to add some carrot?");
addCarrot = myScanner.nextBoolean();
if (addCarrot){
Carrot myCarrot = new Carrot(true);
}else{
Carrot myCarrot = new Carrot(false);
}
myScanner.nextLine();
System.out.println(" Would like to add some Spinach?");
addSpinach = myScanner.nextBoolean();
if (addSpinach){
Spinach mySpinach = new Spinach(true);
}else{
Spinach mySpinach = new Spinach(false);
}
myScanner.nextLine();
myScanner.close();
}
public double getPriceOfBurger() {
return priceOfBurger;
}
public void getTotalCost(){
System.out.println("I am Here....................price = " priceOfBurger);
System.out.println("I am in Lettuce: " myLettuce.getCostOfLettuce() myLettuce.isHaveLettuce());
}
Вот мой
пакет класса Lettuce com.amitsuneja;
открытый класс Lettuce {
private boolean haveLettuce;
private double costOfLettuce;
public Lettuce(boolean haveLettuce) {
this.haveLettuce = haveLettuce;
this.costOfLettuce =2d;
}
public boolean isHaveLettuce() {
return haveLettuce;
}
public void setHaveLettuce(boolean haveLettuce) {
this.haveLettuce = haveLettuce;
}
public double getCostOfLettuce() {
return costOfLettuce;
}
public void setCostOfLettuce(double costOfLettuce) {
this.costOfLettuce = costOfLettuce;
}
}
Комментарии:
1. Не удается вызвать «com.amitsuneja. Lettuce.getCostOfLettuce()» потому что «this.myLettuce» имеет значение null в com.amitsuneja. Hamburger.getTotalCost — я думаю, это довольно явно. Попробуйте внимательно прочитать его и использовать отладчик, если это не прояснит.
2. Затем в вашем конструкторе hamburger вы создаете локальную переменную myLettuce1, но затем вызываете метод переменной-члена myLettuce. Перед ее использованием необходимо создать экземпляр myLettuce. Возможно, вам не нужно создавать переменную myLettuce1
Ответ №1:
Измените этот код
if (addLettuce){
Lettuce myLettuce1 = new Lettuce(true);
}else{
Lettuce myLettuce1 = new Lettuce(false);
System.out.println("I am in Lettuce: " myLettuce.getCostOfLettuce() myLettuce.isHaveLettuce());
}
Для —
if (addLettuce){
myLettuce = new Lettuce(true);
}else{
myLettuce = new Lettuce(false);
System.out.println("I am in Lettuce: " myLettuce.getCostOfLettuce() myLettuce.isHaveLettuce());
}
Комментарии:
1. Проблема здесь в том, что вместо обновления глобальной ссылочной переменной myLettuce вы создали новую ссылочную переменную и присвоили ей объект. И ваша ссылка на myLettuce равна нулю. Следовательно, вы получаете исключение NullPointerException при попытке получить доступ к методу нулевого объекта.
2. Кроме того, вы можете дополнительно импровизировать свой код, используя шаблон декоратора здесь вместо того, чтобы использовать так много условных обозначений
3. я ученик, до сих пор не читал Decorator