开发者

Why does my program only outputs one result instead five?

/*
 *Find if a year is leap or not
 */

public class LeapYear{

    private static int leapYear;

    public void setLeapYear(int leapYear){

        this.leapYear = leapYear;

    }// end method


    public static void main (String[] args) {
        LeapYear leap = new LeapYear();
        leap.setLeapYear(2010);
        leap.setLeapYear(2008);
        leap.setLeapYear(1900);
        leap.setLeapYear(2000);
        leap.setLeapYear(1565);

        // Is it Divisible by 4?
        if (leapYear % 4 == 0) {

            // Is it Divisible by 4 but not 100?
            if (leapYear % 100 != 0) {
                System.out.println(leapYear + ": is a leap year.");
            }
            // Is it Divisible by 4 and 100 and 400?
            else if (leapYear % 400 == 0) {
                System.out.println(leapYear + ": is a leap year.");
            }
            // It is Divisible by 4 and 100 but not 400!
            else {
                System.out.println(leapYear + ": is not a leap year.");
            }
        }
        // It is not divisible by 4.
        else {
            System.out.println(leapYear + ": is not a leap year.");
        }
    }
}

I am new to Java and I wrote this code so that it would call for all five years into the boolean and generate answers for all of th开发者_StackOverflowem. However it only calls the last one. How would I do this right?


Problem 1

The four first calls to setLeapYear:

leap.setLeapYear(2010);    // leap.leapYear = 2010;
leap.setLeapYear(2008);    // leap.leapYear = 2008;
leap.setLeapYear(1900);    // leap.leapYear = 1900;
leap.setLeapYear(2000);    // leap.leapYear = 2000;

gets overridden by the last one:

leap.setLeapYear(1565);    // leap.leapYear = 1565;

I would probably write a boolean method called something like isLeapYear(int year) and do

System.out.println(isLeapYear(2010));
System.out.println(isLeapYear(2008)); 
...


Problem 2

leapYear is static, so you don't need to / shouldn't do LeapYear leap = new LeapYear(); (alternatively, you should drop the static modifier).


You need use separate object for each year or at least call the Leap Year checking method as soon as you crated the object for that year.

What you have is a series of call to a function that assigns a value to an attribute of the same object. Therefore, only the last statement has the effect as previous values are overwritten.

On additional note, your code doesn't seem to be properly organized. Whey do you make the checkings in Main and it seems that leapYear isn't defined anywhere.

Perhaps, you may want to define a function that returns true/false depending on the value of the passed parameter or the value of the year stored in object.

The code may look something like this:

leap.setLeapYear(2010);    // leap.leapYear = 2010;
System.out.println(leap.isLeapYear());

leap.setLeapYear(2008);    // leap.leapYear = 2008;
System.out.println(leap.isLeapYear());
leap.setLeapYear(1900);    // leap.leapYear = 1900;
System.out.println(leap.isLeapYear());
leap.setLeapYear(2000);
System.out.println(leap.isLeapYear());
leap.setLeapYear(1565);
System.out.println(leap.isLeapYear());

You have to define isLeapYear() by moving the checks in main to that function.


I would be inclined to write the tests in your if statements in order from 400 to 4:

String result;
if (year % 400 == 0) {
    result = "is a leap year.";
} else if (year % 100 == 0) {
    result = "is not a leap year.";
} else if (year % 4 == 0) {
    result = "is a leap year.";
} else {
    result = "is not a leap year.";
}
System.out.println(year + ": " + result);
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜