我写了一个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);
}
}
答案 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的调用在很大程度上取决于已经设置的月份和年份,因为您使用month
和year
变量来确定日期是否有效。这意味着只能在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;
}
}
看到区别?