Другое событие 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));
}
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());
^^^^^
Создать заказ
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 ().
вы должны получить объект от 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));
также назовите целое число «сэндвич» на «сэндвич» без заглавной буквы. в противном случае, похоже, вы имеете в виду класс «Сэндвич»
В этой строке:
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.
if()
. This Will Cost 0.0
выводится
– Jon0149
22 February 2015 в 17:47
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)
ord.get(0).getCost());
снизу и теперь он компилируется, но затраты не обновляются – Jon0149 22 February 2015 в 17:51getCost() = 0.0
– Jon0149 22 February 2015 в 19:10