我正在尝试编写一个程序,该程序可以获取有关地毯的用户输入数据,将字符串解析为必要的信息,并根据形状创建地毯对象。我的代码是
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");
}
}
`我不允许编辑调用类的代码。
答案 0 :(得分:0)
您始终必须确保具有返回值的方法中的所有路径都包含return
或抛出异常。在这种情况下,您可以添加:
else {
return null;
}
到方法parseStringToCarpet
的最后一部分,或者只是在方法的末尾写return null
。
返回null
的问题是调用此函数的方法应该知道它可能会返回null
,因此您应该记录它。
答案 1 :(得分:0)
最后返回 null 对象,当不满足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;
}
答案 2 :(得分:0)
当您将该函数声明为返回Carpet
时,您的班级必须返回Carpet
(即使null
)。
当info[0]
既不是circle
也不是rectangle
时,您的函数不会返回任何内容。
快速解决方法是在最后添加return null;
,或者抛出异常(即创建InvalidArgumentException
)。
在第二种情况下,您必须编辑调用类来处理异常,或者将其放在堆栈中。