如果声明对日期不正常

时间:2011-02-23 11:07:54

标签: java date if-statement default-constructor

我写了一个if语句,应该根据数据写出不同的输出。它适用于int y = 2000, m = 5, d = 06;,但在int y = 2889, m = 44, d = 16;时没有输出正确的值。

这是我的代码。有人可以帮我理解错误。

public class Date1 {

    private int year = 1; // any year
    private int month = 1; // 1-12
    private int day = 1; // 1-31 based on month

    //method to set the year
    public void setYear(int y) {
        if (y <= 0) {
            System.out.println("That is too early");
            year = 1;
        }

        if (y > 2011) {
            System.out.println("That year hasn't happened yet!");
            y = 2011;
        } else {
            year = y;
        }
    }

    public int setMonth(int theMonth) {
        if ( theMonth > 0 && theMonth <= 12 ) { // validate month
            return theMonth;
        } else { // month is invalid 
            System.out.printf("Invalid month (%d) set to 1.", theMonth);
            return 1; // maintain object in consistent state
        } // end else   
    }

    public int setDay( int theDay) {
        int[] daysPerMonth = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

        // check if day in range for month
        if ( theDay > 0 && theDay <= daysPerMonth[ month ] ) {
            return theDay;
        }

        // check for leap year
        if ( month == 2 && theDay == 29 && ( year % 400 == 0 || ( year % 4 == 0 && year % 100 != 0 ) ) ) {
            return theDay;
        }

        System.out.printf( "Invalid day (%d) set to 1.", theDay );
        return 1;  // maintain object in consistent state 
    }

    //method to return the year
    public int getYear() {
        return year; 
    }

    //method to return the month
    public int getMonth(){
        return month; 
    }

    //method to return the day 
    public int getDay(){
        return day; 
    }

    // return a String of the form year/month/day
    public String toUniversalStringTime() { 
        return String.format( "The date using a default constructor %d/%d/%d \n", getYear(), getMonth(), getDay() ); 
    } // end toUniversalStringTime
}

public class Date1Test {

    public static void main(String[] args) {        
        int y = 2000, m = 5, d = 06;        

        Date1 d1 = new Date1(); //create a new object

        System.out.println(d1.toUniversalStringTime()); //call toUniversalStringTime()

        System.out.printf("The date I created is %d/%d/%d \n", y , m , d);  
    }
}

3 个答案:

答案 0 :(得分:4)

我没有在你的代码中看到你调用setDay,setMonth或setYear方法的任何地方,所以我希望调用toUniversalStringTime来始终打印

"The date using a default constructor 111 \n"

然后在该调用之后,使用y,m和d

的值手动再次打印它
"The date I created is 200056 \n"

您需要在创建后调用d1对象上的set方法,或者将参数传递给构造函数来设置它们,例如。

d1.setYear(y);
d1.setMonth(m);
d1.setDay(d);

但是请注意关于重构代码的一些其他注释,因为正如已经提到的,每个setter方法都有一些基本缺陷需要先修复。

您的代码的其他一般说明:

在你的setYear方法中,你使用y的值来更新对象的year变量,但是在第二个if中:

if (y > 2011) {
    System.out.println("That year hasn't happened yet!");
    y = 2011;
}

您实际上是将y设置为2011而不是year,因此这将无效。

由于某些原因,在你的setMonth方法中,你实际上并没有设置月份,但是你只是验证传入的值,即如果值不在1到12之间则返回1.因此代码不会匹配方法的名称,您应该更改其中一个。

你的setDay方法与setMonth相同,因为它实际上没有设置日期,只是验证它。但更糟糕的是,对setDay的调用在很大程度上取决于已经设置的月份和年份,因为您使用monthyear变量来确定日期是否有效。这意味着只能在setMonth和setYear之后调用setDay,否则您将始终默认检查0001年1月(因为默认情况下月份和年份设置为1)。

答案 1 :(得分:2)

你的年度安装者错了:

//method to set the year
public void setYear(int y){

   if (y <= 0)
   {
     System.out.println("That is too early");
     year = 1;
   }

   if (y > 2011)
   {
     System.out.println("That year hasn't happened yet!");
     y = 2011;
   }
   else //<-- problem, makes the next stamtement only be executed if y <= 2011
     year = y;
 }

我想最后else声明是你的问题,它使得年份只在2011年之前更新。但我想因为声明y = 2011它应该限于2011年 - - 所以你需要的是删除else

或以简单的方式书写:

public void setYear(int year) {
   this.year = Math.max(1,Math.min(2011,year));
}

答案 2 :(得分:1)

你的setter方法实际上应该设置一个字段并且不返回任何内容(void)。 setYear没问题,但你的两个setter方法setMonth和setDay没有设置任何类字段并返回一个int,这没有任何意义。你的问题是,哪个字段应该setMonth更改,哪个字段应该setDay更改?一旦你回答了这个问题,你就可以改变你的方法,这样他们就能更好地工作。如果其中任何一项没有任何意义,请评论。

E.G。你的二传手是这样的:

// assuming you have an int field foo that should be > 0 and <= 100
public int setFoo(int foo) {
  if (foo < 0) {
     return 0;
  } else if (foo > 100) {
    return 100;
  } else {
    return foo;
  }
}

应该更像是:

public void setFoo(int foo) {
  if (foo < 0) {
     this.foo = 0;
  } else if (foo > 100) {
    this.foo = 100;
  } else {
    this.foo = foo;
  }
}

看到区别?