为什么我的get方法总是返回0

时间:2019-05-24 01:41:54

标签: java

我正在创建此程序,该程序将打印用户输入的日期的日历。在我的方法“ dayOfWeek()”中,该公式采用日月和年份的两种类型,并计算介于0到6之间的数字,该数字等于星期几。 但是我的方法总是返回2,经过一些测试,我发现没有任何get方法(getDay(),getMonth(),getYear())都返回值。

命令行输入为“ dd / mm / yyyy”,分为主要部分。在dayofweek()方法中,它总是返回2或星期一(因为它是分配给2的值)。但是,在定义变量q,m,K和J时,它们都设置为0

谁能看到逻辑错误? (编辑,某些缩进有些偏离)

class MyCalendar
{
private MyDate myDate;
private Day day;
int dayofmonth, month, year;

public static void main(String[] args)
{
    String userinput = args[0];

    String[] splitdate = userinput.split("/");

    int dayofmonth = Integer.parseInt(splitdate[0]);
    int year = Integer.parseInt(splitdate[2]);
    int month = Integer.parseInt(splitdate[1]);
    if (month <= 2)
    {
        month = month + 12;
    }

    MyDate myDate = new MyDate(dayofmonth, month, year);
    MyCalendar mycal = new MyCalendar(myDate);
    Scanner scanner = new Scanner(System.in);

    while (myDate.isDateValid() == false)
    {
        System.out.print("Date is not valid. Please input a valid date: ");

        userinput = scanner.nextLine();

        splitdate = userinput.split("/");

        dayofmonth = Integer.parseInt(splitdate[0]);
        year = Integer.parseInt(splitdate[2]);
        month = Integer.parseInt(splitdate[1]);

        if (month <= 2)
        {
            month = month + 12;
        }

        myDate.isDateValid();
    }

    System.out.println(myDate.getDay() + " " + myDate.getMonth() + " " + myDate.getYear() + " " + mycal.dayOfWeek());
}
public MyCalendar(MyDate myDate)
{
    this.myDate = myDate;
}
public Day dayOfWeek()
{
    MyDate Date = new MyDate(dayofmonth, month, year);

    Day myDay = Day.Sunday;

    int q = Date.getDay();
    int m = Date.getMonth();
    int K = (Date.getYear()%100);
    int J = (Date.getYear()/100);

    int h = ((q + ((13*(m+1))/5) + K + (K/4) + (J/4) + 5*J)%7);

    System.out.println(h + " " + q + " " + m + " " + K + " " + J);

    if (h == 0){
        myDay = Day.Saturday;
        return myDay;
    }
    if (h == 1){
        myDay = Day.Sunday;
        return myDay;
    }
    if (h == 2){
        myDay = Day.Monday;
        return myDay;
    }
    if (h == 3){
        myDay = Day.Tuesday;
        return myDay;
    }
    if (h == 4){
        myDay = Day.Wednesday;
        return myDay;
    }
    if (h == 5){
        myDay = Day.Thursday;
        return myDay;
    }
    if (h == 6){
        myDay = Day.Friday;
        return myDay;
    }

    System.out.println(q + " " + m + " " + K + " " + J);

    return myDay;
}
public int weekOfMonth()
{
    int week = 0;
    return week;
}
public void printCalendar()
{
}
}




class MyDate
private int day;
private int month;
private int year;
public MyDate(int day, int month, int year)
    {
        this.day = day;
        this.month = month;
        this.year = year;
    }

public int getDay()
    {
        return day;
    }

public int getMonth()
    {
        return month;
    }

public int getYear()
    {
        return year;
    }

1 个答案:

答案 0 :(得分:1)

让我们这样思考:

1)MyDate代码很简单。构造函数和获取器。我看不到任何错误。

2)MyDate实例的创建和使用方式如下:

    MyDate Date = new MyDate(dayofmonth, month, year);

    Day myDay = Day.Sunday;

    int q = Date.getDay();
    int m = Date.getMonth();
    int K = (Date.getYear()%100);
    int J = (Date.getYear()/100);

此处存在一些令人震惊的样式错误(Date应该是date,以此类推),这使得这很难理解。有经验的Java程序员在看到Date.getDay()之后会做一番尝试。但这是一条红鲱鱼。

3)真正的问题是dayofmonthmonthyear的值从哪里来?答案:它们被声明为MyCalendar的字段。

   int dayofmonth, month, year;

4)它们在哪里初始化?答:无处!您似乎正在尝试通过main方法初始化它们,如下所示:

   int dayofmonth = Integer.parseInt(splitdate[0]);
   int year = Integer.parseInt(splitdate[2]);
   int month = Integer.parseInt(splitdate[1]);

但是请仔细看!您实际上是在声明和初始化局部变量 ...而不是MyCalendar实例的实例字段。因此,信息不会到达您的代码需要的地方。


您需要重新设计您的代码。例如,问自己为什么MyCalendar既有myDate字段又有dayofmonthmonthyear字段?

仔细研究信息流。

@ScaryWombat恰当地评论:

  

是的...您需要一些思考和发展。

(理论上,我们可以为您重写代码,但是您自己动手即可学到很多东西。特别是“思考”部分。)