Почему я получаю ошибку this.переменная равна нулю в классе Java

#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