Заполнение таблицы с данными из БД для конкретного пользователя [дубликат]

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

1
задан Sotirios Delimanolis 22 February 2015 в 17:42
поделиться

5 ответов

Метод

getCost определяется в классе порядка, а не в классе ShopCLI. Поэтому ваш код:

ord.add(new Order(1, inputOuter, inputInner, inputSauce, 0));
System.out.println("You Made a " + inputInner + " with " + inputSauce + " Sandwich on " + inputOuter);
System.out.println("This Will Cost " + getCost());

Должен быть изменен на

Order order = new Order(1, inputOuter, inputInner, inputSauce, 0);
ord.add(order);
System.out.println("You Made a " + inputInner + " with " + inputSauce + " Sandwich on " + inputOuter);
System.out.println("This Will Cost " + order.getCost());
                                       ^^^^^
2
ответ дан SMA 19 August 2018 в 01:40
поделиться
  • 1
    Все еще ошибки с: Исключение в потоке "main & quot; java.lang.Error: Неразрешенная проблема компиляции: Невозможно сделать статическую ссылку на нестатический метод getCost () из типа Order at components.ShopCLI.main (ShopCLI.java:39) – Jon0149 22 February 2015 в 17:45
  • 2
    Можете ли вы вставить код, который вы изменили в своем Вопросе? Вы делали изменения, как упоминалось выше? Обратите внимание, что я не использовал Capital O в порядке, и я использовал экземпляр заказа, который я создал ранее, если вы проверите мой ответ. – SMA 22 February 2015 в 17:49
  • 3
    Я использовал исправление кода ord.get(0).getCost()); снизу и теперь он компилируется, но затраты не обновляются – Jon0149 22 February 2015 в 17:51
  • 4
    Вы прочитали мой ответ и можете ли вы соответственно изменить его? – SMA 22 February 2015 в 18:31
  • 5
    Я прочитал ответ и изменил его, тем не менее, я все еще получаю getCost() = 0.0 – Jon0149 22 February 2015 в 19:10

Создать заказ

Order order = new Order(1, inputOuter, inputInner, inputSauce, 0);
ord.add(order) // Add the order to your list.

Стоимость заказа задается методом setOrder (int repOrderId, String repOuter, String repInner, String repSauce)

изменить этот метод к следующему.

public void setOrder() {

    double calcCost;
    double outerCost = 0;
    double innerCost = 0;
    double sauceCost = 0;

    // Outer Cost
    if (outer.equalsIgnoreCase("Bun")) {
        outerCost = 0.5;
    } else if (outer.equalsIgnoreCase("Bread")) {
        outerCost = 0.25;
    } else if (outer.equalsIgnoreCase("Brioche")) {
        outerCost = 0.75;
    } else {
        System.out.println("Invalid Bread Type");
    }

    // Inner cost
    if (inner.equalsIgnoreCase("Ham")) {
        innerCost = 0.5;
    } else if (inner.equalsIgnoreCase("Cheese")) {
        innerCost = 0.25;
    } else if (inner.equalsIgnoreCase("Cucumber")) {
        innerCost = 0.75;
    } else {
        System.out.println("Invalid Filling Type");
    }

    // Sauce Cost
    if (sauce.equalsIgnoreCase("Mayo")) {
        sauceCost = 0.5;
    } else if (sauce.equalsIgnoreCase("Butter")) {
        sauceCost = 0.25;
    } else if (sauce.equalsIgnoreCase("Marmite")) {
        sauceCost = 0.75;
    } else {
        System.out.println("Invalid Sauce Type");
    }

    calcCost = outerCost + innerCost + sauceCost;
    this.Cost = calcCost;
}

Теперь вы можете получить стоимость, вызвав getCost () в порядке следующим образом.

Чтобы рассчитать стоимость заказа, вызовите order.setOrder ( ); Чтобы получить стоимость заказа, вызовите order.getCost ();

ПРИМЕЧАНИЕ. Не используйте == для сравнения строки. Всегда используйте equals () или equalsIgnoreCase ().

0
ответ дан AshanPerera 19 August 2018 в 01:40
поделиться

вы должны получить объект от arraylist, затем воспользуйтесь методом:

//get obj,then void
System.out.println("This Will Cost " + ord.get(choise).getCost());

это вернет 0, так как вы устанавливаете стоимость 0 в конструкторе:

ord.add(new Order(1, inputOuter, inputInner, inputSauce, 0));

также назовите целое число «сэндвич» на «сэндвич» без заглавной буквы. в противном случае, похоже, вы имеете в виду класс «Сэндвич»

0
ответ дан cody b 19 August 2018 в 01:40
поделиться

В этой строке:

System.out.println("This Will Cost " + getCost());

... вы не указываете, что вы хотите называть getCost(), поэтому он вызывает его в ShopCLI, потому что это то, где происходит вызов. Но ShopCLI не имеет метода getCost(). Вам нужно позвонить ему по вашему заказу:

System.out.println("This Will Cost " + ord.get(0).getCost());

Это работает, но когда вы создаете свой объект Order, вызывая конструктор, вы не вычисляете стоимость, а скорее устанавливаете все, что передается. Обновите свой конструктор следующим образом:

    //Constructor
    public Order(int OrderId, String outer, String inner, String sauce) {
        super(outer, inner, sauce);
        this.OrderId = OrderId;

        double calcCost;
        double outerCost = 0;
        double innerCost = 0;
        double sauceCost = 0;

        //Outer Cost
        if(outer == "Bun")
        {
            outerCost = 0.5;
        }
        else if(outer == "Bread")
        {
            outerCost = 0.25;
        }
        else if(outer == "Brioche")
        {
            outerCost = 0.75;
        }
        else
        {
            System.out.println("Invalid Bread Type");
        }

        //Inner cost
        if(inner == "Ham")
        {
            innerCost = 0.5;
        }
        else if(inner == "Cheese")
        {
            innerCost = 0.25;
        }
        else if(inner == "Cucumber")
        {
            innerCost = 0.75;
        }
        else
        {
            System.out.println("Invalid Filling Type");
        }

        //Sauce Cost
        if(sauce == "Mayo")
        {
            sauceCost = 0.5;
        }
        else if(sauce == "Butter")
        {
            sauceCost = 0.25;
        }
        else if(sauce == "Marmite")
        {
            sauceCost = 0.75;
        }
        else
        {
            System.out.println("Invalid Sauce Type");
        }

        calcCost = outerCost + innerCost + sauceCost;
        this.Cost = calcCost;

    }

Теперь ваш конструктор работает, но вам придется удалить аргумент, в котором вы его вызываете, поэтому измените строку ord.add на это:

ord.add(new Order(1, inputOuter, inputInner, inputSauce));

Это должно, если я не ошибаюсь. Однако вы можете подумать о создании частного вспомогательного метода под названием calculateCost, чтобы вы не дублировали код между вашим конструктором и вашими методами setOrder.

0
ответ дан Dogs 19 August 2018 в 01:40
поделиться
  • 1
    Это позволяет ему скомпилировать (Thankyou), но теперь обновление моих Costs arent в соответствии с массивным заявлением if(). This Will Cost 0.0 выводится – Jon0149 22 February 2015 в 17:47
  • 2
    Ваш массивный оператор if вызывается только в setOrder (). Попробуйте добавить оператор if к вашему конструктору Order. – Dogs 22 February 2015 в 17:51
  • 3
    Я обновил свой ответ. Пожалуйста, посмотри на это. Это должно объяснить вашу проблему. – Dogs 22 February 2015 в 18:04
  • 4
    Этот ответ компилируется и запускается, но когда я печатаю стоимость, он все еще отображает 0.0 System.out.println("This Will Cost " + ord.get(0).getCost()); – Jon0149 22 February 2015 в 19:06

я изменил ваш код для класса ShopCLI

package tester;

import java.util.ArrayList;
import java.util.Scanner;

public class ShopCLI {

public static void main(String[] args) {

   ArrayList<Order> ord = new ArrayList<>();
   int orderNumber =1;
   System.out.println("Welcome to Sandwich Shop CLI V1!");
   System.out.println("start order");

   Scanner sc = new Scanner(System.in);
  while(true){
   System.out.println("Press 1 for new order or 2 to Exit");
   int choice = sc.nextInt();

   if (choice == 1){
     System.out.println("Enter outer Options:Outer Options are Bun, Bread or Brioche");

      String inputOuter = sc.next();

      System.out.println("Enter inner Options:Inner Options are Ham, Cheese or Cucumber");

      String inputInner = sc.next();

      System.out.println("Enter sauce Options:Sauce Options are Mayo, Butter or Marmite");

      String inputSauce = sc.next();
     Order order1 = new Order(orderNumber, inputOuter, inputInner, inputSauce, 0);
     order1.setOrder(inputOuter, inputInner, inputSauce);
       System.out.println("You Made a " + inputInner + " with " + inputSauce + " Sandwich on " + inputOuter);
       System.out.println("This Will Cost " + order1.getCost());
       ord.add(order1);
   }
   else if (choice == 2){
       System.out.println("Exited.");
       System.exit(1);
   }
  }
 }

}

, а формат setOrder также изменен public void setOrder(String repOuter, String repInner, String repSauce)

0
ответ дан Nick 19 August 2018 в 01:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: