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

标签 java

我正在创建这个程序,它将打印用户输入的日期的日历。在我的方法 dayOfWeek() 中,公式采用日、月和两种类型的年份,并计算 0-6 之间的数字,该数字等于一周中的某一天。 然而,我的方法总是返回 2,经过一些测试,我发现没有任何 get 方法 (getDay()getMonth()getYear()) code> 返回值。

命令行输入是“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) MyDate 代码很简单。构造函数和 setter/getter 。我没有看到任何错误。

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 字段,又有单独的 dayofmonthmonth字段?

仔细思考信息流。

正如@ScaryWombat 恰本地评论的那样:

Yeah ... a bit of thinking and development is required on your part.

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

关于java - 为什么我的 get 方法总是返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56284844/

相关文章:

java - 如何防止两个事件被触发?

java - 清除除顶部 fragment 之外的 fragment Backstack

java - 冒泡排序算法中的外循环

java - AWS Lambda : How to access other account's bucket using IAM Roles in Java

java - 无法使用 oracle.apex.APEXExport 类登录数据库

java - 模拟类的所有实例

java - widgetsets GWT 模块描述文件并在 vaadin 中重新编译你的 widgetset 错误

java - 将jdbc添加到maven项目中

java - Selenium 网络驱动程序 : <WebElement> Iterator cannot be resolved to a type

JavaFX:在矩形内设置边框以保持宽度和高度