-3

我写了一个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);  
    }
}
4

3 回答 3

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 的值来更新对象的年份变量,但在第二个中,如果:

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

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

出于某种原因,在您的 setMonth 方法中,您实际上并未设置月份,而只是验证传入的值,即如果该值不在 1 和 12 之间,则返回 1。因此代码与名称不匹配的方法,你应该改变一个或另一个。

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

于 2011-02-23T11:15:13.690 回答
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));
}
于 2011-02-23T11:14:03.360 回答
1

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

EG你的二传手是这样的:

// 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;
  }
}

看到不同?

于 2011-02-23T11:13:05.277 回答