0

我正在尝试编写一个程序,该程序可以获取有关地毯的用户输入数据,将字符串解析为必要的信息片段,并根据形状创建地毯对象。我的代码是

    public class CarpetParser{

    public static Carpet parseStringToCarpet(String lineToParse)
    {
        String delims = "[/]";
        String[] info = lineToParse.split(delims);
        if(info[0].equalsIgnoreCase("rectangle")){
            double priceFor = Double.parseDouble(info[2]);
            int height = Integer.parseInt(info[3]);
            int width = Integer.parseInt(info[4]);
            RectangleCarpet theCarpet = new RectangleCarpet(info[1], priceFor, height, width);
            return theCarpet;

        }else if(info[0].equalsIgnoreCase("circle")){
            double priceFor = Double.parseDouble(info[2]);
            int radius = Integer.parseInt(info[3]);
            CircleCarpet theCarpet = new CircleCarpet(info[1], priceFor, radius);
            return theCarpet;

        }

    }
}

对于解析器,

    public abstract class Carpet{

    protected int area = 0;
    protected double unitPrice = 0;
    protected double totalPrice = 0.0;
    protected String carpetID;

    public Carpet(String ID, double thisPrice){
        carpetID = ID;
        unitPrice = thisPrice;
    }

    public String getCarpetId(){
        return carpetID;
    }

    public String toString(){
        String carpet = new String("\n" + "The CarpetId:\t\t" + getCarpetId() + "\nThe Area:\t\t" + area + "\nThe Unit Price\t\t" + unitPrice + "\nThe Total Price\t" + totalPrice + "\n\n");
        return carpet;
    }

    public abstract void computeTotalPrice();

}

对于地毯,

    public class RectangleCarpet extends Carpet{

    private int height;
    private int width;

    public RectangleCarpet(String ID, double priceOf, int h, int w){
        super(ID, priceOf);
        height = h;
        width = w;
        computeTotalPrice();
    }

    public void computeTotalPrice(){
        super.area = height * width;
        super.totalPrice = unitPrice * area;
    }

    public String toString(){
        String forThis = new String("\nThe Carpet Shape:\tRectangle\nThe Height:\t\t" + height + "\nThe Width:\t\t" + width +"\n");
        return forThis + super.toString();

    }

}

对于其中一种地毯形状和

    public class CircleCarpet extends Carpet{

    private int radius;

    public CircleCarpet(String ID, double priceOf, int rad){
        super(ID, priceOf);
        radius = rad;
        computeTotalPrice();

    }

    public void computeTotalPrice(){
        super.area = radius * radius * 3;
        super.totalPrice = area * unitPrice;
    }


    public String toString(){
        String forThis = new String("\nThe Carpet Shape:\tCircle\nThe radius:\t\t" + radius + "\n");
        return forThis + super.toString();
    }

}

对于其他形状。问题是parseStringToCarpet缺少返回值,我无法弄清楚它需要返回什么,因为如果我尝试返回theCarpet它说它是错误的类型。

调用类是

`import java.io.*;         //to use InputStreamReader and BufferedReader
import java.util.*;       //to use ArrayList

public class Menu
 {
  public static void main (String[] args)
   {
     char input1;
     String inputInfo = new String();
     String line = new String();
     boolean found;

     // ArrayList object is used to store carpet objects
     ArrayList carpetList = new ArrayList();

     try
      {
       printMenu();     // print out menu

       // create a BufferedReader object to read input from a keyboard
       InputStreamReader isr = new InputStreamReader (System.in);
       BufferedReader stdin = new BufferedReader (isr);

       do
        {
         System.out.println("What action would you like to perform?");
         line = stdin.readLine().trim();
         input1 = line.charAt(0);
         input1 = Character.toUpperCase(input1);

         if (line.length() == 1)
          {
           switch (input1)
            {
             case 'A':   //Add Carpet
               System.out.print("Please enter a carpet information to add:\n");
               inputInfo = stdin.readLine().trim();
               carpetList.add(CarpetParser.parseStringToCarpet(inputInfo));
               break;
             case 'C':   //Compute Total Price For Each Carpet
               for (int i=0; i<carpetList.size();i++)
                     ((Carpet) carpetList.get(i)).computeTotalPrice();
               System.out.print("total prices computed\n");
               break;
             case 'D':   //Search for Carpet
               System.out.print("Please enter a carpetID to search:\n");
               inputInfo = stdin.readLine().trim();
               found = false;
               for (int i=0; i<carpetList.size();i++)
                {
                 if (inputInfo.equals(((Carpet)carpetList.get(i)).getCarpetId()))
                  {
                   found = true;
                  }
                }
                if (found == true)
                 System.out.print("carpet found\n");
                else
                 System.out.print("carpet not found\n");
               break;
             case 'L':   //List Carpets
               if (carpetList.isEmpty())
                System.out.print("no carpet\n");
               else
                for (int i=0; i < carpetList.size(); i++)
                  System.out.print(carpetList.get(i).toString());
               break;
             case 'Q':   //Quit
               break;
             case '?':   //Display Menu
               printMenu();
               break;
             default:
               System.out.print("Unknown action\n");
               break;
            }
         }
        else
         {
           System.out.print("Unknown action\n");
          }
        } while (input1 != 'Q'); // stop the loop when Q is read
      }
     catch (IOException exception)
      {
        System.out.println("IO Exception");
      }
  }

  /** The method printMenu displays the menu to a use **/
  public static void printMenu()
   {
     System.out.print("Choice\t\tAction\n" +
                      "------\t\t------\n" +
                      "A\t\tAdd Carpet\n" +
                      "C\t\tCompute Total Price For Each Carpet\n" +
                      "D\t\tSearch for Carpet\n" +
                      "L\t\tList Carpets\n" +
                      "Q\t\tQuit\n" +
                      "?\t\tDisplay Help\n\n");
  }
}

` 我不允许编辑调用类的代码。

4

3 回答 3

0

您始终必须确保具有返回值的方法中的所有路径都包含一个return或抛出异常。在这种情况下,您可以添加:

 else {
            return null;
        }

到方法的最后一部分parseStringToCarpet,或者只是写return null在方法的末尾。

返回的问题null是调用此函数的方法应该知道它可能会返回null,因此您应该记录它。

于 2013-02-01T15:41:25.760 回答
0

最后返回一个对象,当if-else条件不满足时将调用它,但请确保在调用它时进行非空检查

公共类 CarpetParser{

public static Carpet parseStringToCarpet(String lineToParse)
{
    String delims = "[/]";
    String[] info = lineToParse.split(delims);
    if(info[0].equalsIgnoreCase("rectangle")){
        double priceFor = Double.parseDouble(info[2]);
        int height = Integer.parseInt(info[3]);
        int width = Integer.parseInt(info[4]);
        RectangleCarpet theCarpet = new RectangleCarpet(info[1], priceFor, height, width);
        return theCarpet;

    }else if(info[0].equalsIgnoreCase("circle")){
        double priceFor = Double.parseDouble(info[2]);
        int radius = Integer.parseInt(info[3]);
        CircleCarpet theCarpet = new CircleCarpet(info[1], priceFor, radius);
        return theCarpet;

    }

    return null;
  }
于 2013-02-01T15:42:38.290 回答
0

当您将函数声明为返回 aCarpet时,您的类必须返回 a Carpet(即使null)。

info[0]既不是circleorrectangle时,您的函数不返回任何内容。

快速解决方法是return null;在末尾添加 a 或抛出异常(即 create InvalidArgumentException)。

在第二种情况下,您必须编辑调用类以处理异常或将其进一步抛出堆栈。

于 2013-02-01T15:43:19.693 回答