关于退货声明的问题

0 java algorithm return

import java.util.Scanner;

public class GregorianYear

{
    private int year;

    public GregorianYear(int a)

    {
        year = a;
    }

    public void SetYear()
        {
        System.out.println( "The year is: " );
        Scanner kbd = new Scanner( System.in );
            year = kbd.nextInt();
    }

    public int getYear()
    {
        return year;
    }

    public boolean isLeapYear()
    {
        if ( year > 1852 )
        {
            if ( year % 100 == 0)
            {
                if ( year % 400 == 0)
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
        }
    //Compiler says I need a return statement here.
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在编写一个(应该是)类的简单程序,当我在那里没有任何东西时,它说我需要一个return语句.我假设我只能返回一个布尔语句,所以我输入return isLeapYear();. 当我这样做时,我的测试方法(具有公共静态void main的另一个文件)运行并在我输入return语句的行中导致StackOverflow错误.我究竟做错了什么?

Esk*_*sko 8

编译器是正确的,你的方法结构的方式意味着在它的最末端有一个额外的分支路径需要处理,在这种情况下它是不可见的else分支if ( year > 1852 ).如果再次调用相同的方法,实际上只是将它指向同一个else分支,因为年份不会在调用之间发生变化,从而导致无限递归.

您真正希望得到的答案是" 是否是1852年之前的任何一年闰年? ",但是因为这个问题实际上并不是原子的(格里高利历从1582年2月24日开始)你甚至有一个错误的权利在那里,所以在确定之后你可以安全地说不,在那之前的任何年份都不能闰年.