错误:预期的类,接口或枚举

时间:2014-08-17 23:59:47

标签: java enums

我有以下代码,我正在尝试为我所在的课程中的项目工作。我还将包括要求

设计并实现在课程中实现星期几的课程日。上课日应该存储一天,例如太阳周日。该程序应该能够对Day类型的对象执行以下操作:

一个。设定一天。

B中。打印一天。

℃。回归这一天。

d。第二天回来。

电子。返回前一天。

F。通过在当天添加特定日期来计算并返回当天。例如,如果当天是星期一,我们添加四天,则返回的日期是星期五。同样,如果今天是星期二,我们加13天,则返回的日期是星期一。

-G。添加适当的构造函数。

小时。编写方法的定义以实现类Day的操作,如A到G中所定义。

予。编写一个程序来测试课堂上的各种操作。

代码如下:

`import java.util.*;


class Day {
private int dayValue;
private static final int INVALID = -1;
public Day() { this.dayValue = INVALID; }
public Day(String day) { setDay(day); }
public Day(int day) { this.dayValue = (day<0 || day>6) ? INVALID : day; }
public void setDay(String day) {
    if(day.equals("sunday") || day.equals("Sun")) {
        this.dayValue = 0;
    } else if(day.equal("monday") || day.equals("Mon")) {
        this.dayValue = 1;
    } else if(day.equals("tuesday") || day.equals("Tues")) {
        this.dayValue = 2;
    } else if(day.equal("wednesday") || day.equals("Wed")) {
        this.dayValue = 3;
    } else if(day.equals("thursday") || day.equals("Thurs")) {
        this.dayValue = 4;
    } else if(day.equal("friday") || day.equals("Fri")) {
        this.dayValue = 5;
    } else if(day.equal("saturday") || day.equals("Sat")) {
        this.dayValue = 6;
    } else {
        this.dayValue = INVALID;
    }
}

public String getDay() {
    if (dayValue==0) { return "Sunday"; }
    if (dayValue==1) { return "Monday"; }
    if (dayValue==2) { return "Tuesday"; }
    if (dayValue==3) { return "Wednesday"; }
    if (dayValue==4) { return "Thursday"; }
    if (dayValue==5) { return "Friday"; }
    if (dayValue==6) { return "Saturday"; }

    return "\"I don't know what day it is!\"";

}
public void printDay() {
    System.out.println("When printing, your day is " + getDay()); //displays the day at the time of printing.
}
// Next Day
public String getNextDay()
  {
     // the compareTo() method allows us to set saturday as Sat, Sunday to Sun, etc
     if((day.compareTo("sunday") == 0) || (day.compareTo("Sun") == 0))
        return ("Monday");
     else if((day.compareTo("monday") == 0) || (day.compareTo("Mon") == 0))
        return ("Tuesday");
     else if((day.compareTo("tuesday") == 0) || (day.compareTo("Tue") == 0))
        return ("Wednesday");
     else if((day.compareTo("wednesday") == 0) || (day.compareTo("Wed") == 0))
        return ("Thursday");
     else if((day.compareTo("thursday") == 0) || (day.compareTo("Thu") == 0))
        return ("Friday");
     else if((day.compareTo("friday") == 0) || (day.compareTo("Fri") == 0))
        return ("Saturday");
     else if((day.compareTo("saturday") == 0) || (day.compareTo("Sat") == 0))
        return ("Sunday");
     else
        return ("\"I don't know what day it is!\"");
  }
  // Previous day
  public String getPreDay()
  {
     if((day.compareTo("sunday") == 0) || (day.compareTo("Sun") == 0))
        return ("Saturday");
     else if((day.compareTo("saturday") == 0) || (day.compareTo("Sat") == 0))
        return ("Friday");
     else if((day.compareTo("friday") == 0) || (day.compareTo("Fri") == 0))
        return ("Thursday");
     else if((day.compareTo("thursday") == 0) || (day.compareTo("Thu") == 0))
        return ("Wednesday");
     else if((day.compareTo("wednesday") == 0) || (day.compareTo("Wed") == 0))
        return ("Tuesday");
     else if((day.compareTo("tuesday") == 0) || (day.compareTo("Tue") == 0))
        return ("Monday");
     else if((day.compareTo("monday") == 0) || (day.compareTo("Mon") == 0))
        return ("Sunday");
        return ("\"I don't know what day it is!\"");
  }
public Day calcDay(int offset) { /* your code here */ }
// extra good for printin
public String toString() { return getDay(); }
}


  // main execution point
 public static void main (String args[]) {
  {
   // One of its weakness is the case sensitive: sun, Sunday, sunday, SuNdAy...
   // need more codes to avoid this case sensitiveness...

   // instantiate testday object of type MyDay class
     // with "Sun" as initial value....
     Day testday = new Day("Sun");
     // prompt user to set his/her day
     System.out.print("Enter day to set your day: ");
     // read and store user's day
     String storeday = readinput.nextLine().toLowerCase(); //Changes input into all lowercase to deal with variations
     // invoke setDay() method to set a day defined by user
     testday.setDay(storeday);
     // invoke getDay() method to get a day
     System.out.println("Your day is " + testday.getDay());
     // test printing by invoking printDay() method
     testday.printDay();
     // invoke getPreDay() method to get the previous day
     System.out.println("Your previous day is " + testday.getPreDay());
     // invoke getNextDay() method to get the next day
     System.out.println("Your next day is " + testday.getNextDay());

     System.out.println("How many Days would you like to add? " + testday.calcNextDay());
  }


}`

我收到以下错误:

Day.java:92: error: class, interface, or enum expected
     public static void main () {

                   ^
Day.java:101: error: class, interface, or enum expected
         System.out.print("Enter day to set your day: ");

         ^
Day.java:103: error: class, interface, or enum expected
         String storeday = readinput.nextLine().toLowerCase(); //Changes input into all lowercase to deal with variations
         ^
Day.java:105: error: class, interface, or enum expected
         testday.setDay(storeday);
         ^
Day.java:107: error: class, interface, or enum expected
         System.out.println("Your day is " + testday.getDay());
         ^
Day.java:109: error: class, interface, or enum expected
         testday.printDay();
         ^
Day.java:111: error: class, interface, or enum expected
         System.out.println("Your previous day is " + testday.getPreDay());
         ^
Day.java:113: error: class, interface, or enum expected
         System.out.println("Your next day is " + testday.getNextDay());
         ^
Day.java:115: error: class, interface, or enum expected
         System.out.println("How many Days would you like to add? " + testday.calcNextDay());
         ^
Day.java:116: error: class, interface, or enum expected
      }
      ^
10 errors

最初我的代码看起来像这样

public class Day { static Scanner readinput = new Scanner(System.in);
String day; public Day(String day) { day = "Sunday"; } // set the day public void setDay(String theDay) { day = theDay; } public String getDay() { return day; } public void printDay() { System.out.println("When printing, your day is " + day); }

2 个答案:

答案 0 :(得分:2)

为什么不使用数组?

使用数组,您可以更简洁,更简单地处理事情。

String[] dayOfWeekShortNames = new String[] { 
    "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" 
};

String[] dayOfWeekLongNames = new String[] {
    "Sunday", "Monday", "Wednesday", "Thursday", "Friday", "Saturday"
};

然后,只需验证参数中传递的值是否正确。

public void setDay(String dayOfWeek) {
    if (dayOfWeek == null || (0 < dayOfWeek.length() && dayOfWeek.trim().length() == 0))
        throw new IllegalArgumentException("dayOfWeek cannot be null or white space.");

    for (int i = 0; i < dayOfWeek.length(); i++)
        if (dayOfWeek.charAt(i).isDigit()) 
            throw new IllegalArgumentException("dayOfWeek cannot be numeric.");

    if (dayOfWeek.length() < 3) // for short names
        throw new IllegalArgumentException("dayOfWeek must be at least 3 characters long.");

    for (int i = 0; i < dayOfWeekShortNames.length && i < dayOfWeekLongNames.length; i++)
        if (dayOfWeekShortNames[i].toLowerCase() == dayOfWeek.ToLowerCase()
            || dayOfWeekLongNames[i].toLowerCase() == dayOfWeek.ToLowerCase()) {
            dayValue = i;
            return;
        }        

    throw new IllegalArgumentException(
        "Day of week: " + dayOfWeek + " could not be found.");
}

这只是一个简单的例子。

为什么不使用Program类?

而不是仅仅编写main()方法,这可能会导致多个编译时错误,或许最重要的是在main类中找到Program方法所以它是一个类的成员,编译器不再投诉。此外,这样做的好处是,至少在某种程度上,你的程序切入点是显而易见的。此Program类只包含main()方法。

public class Program {
    public static void main(String args[]) {
        // You code here...
    }
}

对于用户输入,可能使用Console类......以下是如何使用它的示例。

  

<强>声明

     

我没有测试过这段代码,只是按原样提供。我不是Java专家,我尽力帮助。

修改

  

我没有使用数组,因为我想将值存储为字符串而不是索引。

事实上,您问题中的代码示例按照此行存储整数值中的星期几:

private int dayValue;

因此,当您按如下方式设置日期时的分配:

public void setDay(String day) {
    if (day == "sunday" || day == "Sun")
        dayValue = 0;
    else if (day == "monday" || day == "Mon")
        dayValue = 1;
    ...
}

以上实际上以整数格式存储星期几,该格式将满足大多数将要使用星期几的系统。另外,您无法保证用户输入字符串的确切语法,因此即使您要比较day == "sunday"day == "Sun",也必须根据您期望的字符串调整外壳。你的setDay()函数,在我看来是没有意义的。

这种行为最常见的做法是在一周中使用几天等,使用具有正确预期外壳的数组,然后将输入值与大写或小写值进行比较,输入值和来自数组(只有这可以保证完美匹​​配),然后您可以将索引存储在dayValue私有成员中。然后,当通过getDay()函数检索星期几时,您只需编写一行代码即可确保您完美地工作,因为您在通过{{1}设置输入时捕获了任何潜在错误方法。

setDay()

您将获得之前设置的星期几的名称,而不必一遍又一遍地写public String getDay() { return dayOfWeekLongNames[dayValue]; }

答案 1 :(得分:1)

解决问题的另一种方法是在一周中使用枚举。这是一个工作示例,用于显示总体思路:

public class Day
{
    enum DAY {
        MONDAY("Monday"), TUESDAY("Tuesday"), WEDNESDAY("Wednesday"), THURSDAY("Thursday"), FRIDAY("Friday"), SATURDAY(
            "Saturday"), SUNDAY("Sunday");

        public static DAY parse(final String value)
        {
            for (final DAY day : values())
            {
                if (day.description.equalsIgnoreCase(value) || day.description.substring(0, 3).equalsIgnoreCase(value))
                {
                    return day;
                }
            }
            return null;
        }

        private String description;

        private DAY(final String description)
        {
            this.description = description;
        }

        @Override
        public String toString()
        {
            return description;
        }
    }

    public static void main(final String args[])
    {
        Day myDay;

        myDay = new Day(DAY.SUNDAY);

        System.out.println(myDay);
        System.out.println(myDay.getPreviousDay());
        System.out.println(myDay.getNextDay());

        myDay = new Day("monday");

        System.out.println(myDay);
        System.out.println(myDay.getPreviousDay());
        System.out.println(myDay.getNextDay());

        myDay = new Day("wed");

        System.out.println(myDay);
        System.out.println(myDay.getPreviousDay());
        System.out.println(myDay.getNextDay());
    }

    private final DAY day;

    public Day(final DAY day)
    {
        this.day = day;
    }

    public Day(final String day)
    {
        this.day = DAY.parse(day);
    }

    public DAY getNextDay()
    {
        final DAY[] days = DAY.values();
        return days[(day.ordinal() + 1) % days.length];
    }

    public DAY getPreviousDay()
    {
        final DAY[] days = DAY.values();
        return days[((day.ordinal() - 1) + days.length) % days.length];
    }

    @Override
    public String toString()
    {
        return day.toString();
    }
}