【问题标题】:Why am I getting the error "the Method Is Undefined for the type"?为什么我收到错误“该类型的方法未定义”?
【发布时间】:2015-04-23 23:34:00
【问题描述】:

我正在大学学习基础知识,希望 Eclipse 帮助解决以下错误:“方法 getCost() 未定义 ShopCLI 类型”&

"Exception in thread "main" java.lang.Error: Unresolved compilation problem:
    The method getCost() is undefined for the type ShopCLI
    at components.ShopCLI.main(ShopCLI.java:39)

这是我的代码

public class ShopCLI {

    public static void main(String[] args) {

        ArrayList<Order> ord = new ArrayList<>();

        System.out.println("Welcome to Sandwich Shop CLI V1!");
        System.out.println("Please Choose and Option by Typing the Appropriate Number from the List");
        System.out.println("1.New Order");

        Scanner sc = new Scanner(System.in);
        int choice = sc.nextInt();

        System.out.println("Please Choose an Outer From the List: ");
        System.out.println("Press 1 to Continue or 2 to Exit");
        int Sandwich = sc.nextInt();

        System.out.println("Outer Options are Bun, Bread or Brioche");

        String inputOuter = sc.next();

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

        String inputInner = sc.next();

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

        String inputSauce = sc.next();


        if (Sandwich == 1){
            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());
        }
        else if (Sandwich == 2){
            System.out.println("Exited.");
        }

    }

}

public class Sandwich {

    //Fields
    ArrayList<Sandwich> sandwich = new ArrayList<>();
    String outer;
    String inner;
    String sauce;

    //Constructor
    public Sandwich(String outer, String inner, String sauce){
        this.outer = outer;
        this.inner = inner;
        this.sauce = sauce;
    }

    //Methods

    public String getOuter(){
        return outer;
    }

    public String getInner(){
        return inner;
    }

    public String getSauce(){
        return sauce;
    }

    public void setOuter(String repOuter){
        outer = repOuter;
    }

    public void setInner(String repInner){
        inner = repInner;
    }

    public void setSauce(String repSauce){
        sauce = repSauce;
    }

    public void createSandwich(String outer, String inner, String sauce){
        sandwich.add(new Sandwich(outer, inner, sauce));
    }

    public void setSandwich(String repOuter, String repInner, String repSauce){
        outer = repOuter;
        inner = repInner;
        sauce = repSauce;
    }

    public void resetOrder(){
        sandwich.removeAll(sandwich);
    }
}

public class Order extends Sandwich {

    //Fields
    int OrderId;
    double Cost;


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

    }

    //Methods

    public int getOrderId(){
        return this.OrderId;
    }

    public double getCost(){
        return this.Cost;
    }

    public void setOrderId(int repOrderID){
        this.OrderId = repOrderID;
    }

    public void overrideCost(int Cost){
        this.Cost = Cost;
    }

    public void setOrder(int repOrderId, String repOuter, String repInner, String repSauce){
        this.OrderId = repOrderId;
        this.outer = repOuter;
        this.inner = repInner;
        this.sauce = repSauce;

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

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

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

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

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

    }

}

【问题讨论】:

    标签: java methods types constructor undefined


    【解决方案1】:

    getCost 方法是在 order 类中定义的,而不是在 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());
                                           ^^^^^
    

    【讨论】:

    • 仍然出现错误:线程“main”中的异常 java.lang.Error:未解决的编译问题:无法从 components.ShopCLI 的 Order 类型中对非静态方法 getCost() 进行静态引用.main(ShopCLI.java:39)
    • 您可以将您更改的代码粘贴到您的问题中吗?您是否进行了上述更改?请注意,我没有按顺序使用大写 O,如果您检查我的答案,我已经使用了我之前创建的订单实例。
    • 我使用了下面的代码更正ord.get(0).getCost());,现在它可以编译,但成本没有更新
    • 我已阅读答案并进行了相应更改,但我仍然收到getCost() = 0.0
    • 那是因为您将 0 作为其他 new Order(1, inputOuter, inputInner, inputSauce, 0) 的成本传递,请参阅最后一个参数。
    【解决方案2】:

    您必须从数组列表中获取对象,然后访问该方法:

    //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));
    

    另外,将整数“Sandwich”命名为“sandwich”,不使用大写字母。否则,看起来你的意思是“三明治”类

    【讨论】:

      【解决方案3】:

      在这一行:

      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
      • 您的大量 if 语句仅在 setOrder() 中调用。尝试将 if 语句添加到 Order 构造函数中。
      • 我更新了我的答案。请看一下。它应该能解释你的问题。
      • 该答案编译并运行,但是当我打印出成本时,它仍然显示 0.0 System.out.println("This Will Cost " + ord.get(0).getCost());
      【解决方案4】:

      创建订单

      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()。

      【讨论】:

        【解决方案5】:

        我已经修改了 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)

        【讨论】:

          猜你喜欢
          • 2017-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-28
          • 2012-01-30
          相关资源
          最近更新 更多