Java 关于返回声明的问题
我正在为类编写一个(应该是)简单的程序,当我没有任何东西时,它会说我需要一个return语句。我假设只能返回布尔语句,因此输入return isLeapYear();。当我这样做时,我的测试方法(另一个带有公共静态void main的文件)会运行,并在我输入return语句的行中导致StackOverflow错误。我做错了什么?当然,在外部if之后需要一个return语句。因为如果您的方法声明了返回值,那么年份基本上可以是Java 关于返回声明的问题,java,algorithm,return,Java,Algorithm,Return,我正在为类编写一个(应该是)简单的程序,当我没有任何东西时,它会说我需要一个return语句。我假设只能返回布尔语句,因此输入return isLeapYear();。当我这样做时,我的测试方法(另一个带有公共静态void main的文件)会运行,并在我输入return语句的行中导致StackOverflow错误。我做错了什么?当然,在外部if之后需要一个return语句。因为如果您的方法声明了返回值,那么年份基本上可以是,因此此方法中的所有代码路径都必须返回一些内容,对于您发布的代码,如果年份
,因此此方法中的所有代码路径都必须返回一些内容,对于您发布的代码,如果年份提示:如果您使用return isLeapYear()在isLeapYear()
方法的主体中,您告诉它递归调用自身
提示2:修复代码的缩进,您将更容易理解它的错误。编译器是正确的,您的方法的结构方式意味着在它的末端有一个额外的分支路径需要处理,在这种情况下,它是if的不可见else
分支(year>1852)
。如果您再次调用同一个方法,实际上您只是将其再次定向到同一个else分支,因为调用之间的年份不会改变,这会导致无限递归
你真正想要的是“1852年之前的任何一年是否是闰年?”这个问题的答案,然而,因为这个问题实际上不是原子的(公历从1582年2月24日开始)您甚至有一个bug,所以在修复之后,您可以放心地说不,在这之前的任何年份都不能是闰年。当您编写“return IsLeapYear()”时,您会导致一个infinte循环。
由于您不关心1852年之前的年份,只需返回true或false并得到一个-…您必须添加return false;
。因为该方法需要返回一个值(布尔值)。
如果if中的第一个条件不正确,则将跳过所有内容。
您的第一个条件检查year如果您再次调用isLeapYear,它将永远运行。但请使用正确的标识
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.
}
}
如您所见,您没有if(year>1852)和if(year%100==0)的else语句,因此编译器无法确保返回值。您需要为每个代码路径返回一个值,包括1853年之前的路径。在您的代码中,不考虑这种情况
以下函数将按照您的意愿工作。我假设您实际上是指1582年,因为那是公历开始使用的一年(无论如何,在天主教世界)。由于该年10月颁布,1582年本身不是闰年,尽管符合4/100/400规则
<>我已经把代码重新格式化为我认为更可读的风格——我不是一个大的迷,<代码>返回<代码> s,后面跟着<代码>其他代码>代码>,因为它们打破了我的观点(其他人可能不同意,但我相信这种形式使压痕问题更容易发现)。.而且,除此之外,你似乎根本没有考虑到每四年一次的规则
if ( year > 1852 )
{
if ( year % 100 == 0)
{
if ( year % 400 == 0)
{
return false;
}
else
{
return true;
}
}
}
public boolean isLeapYear(){
//在教皇格雷格之前没有闰年。
如果(年份<1583)
返回false;
//400的倍数是闰年。
如果(年份%400==0)
返回true;
//100的倍数(400的倍数除外)不适用。
如果(年份%100==0)
返回false;
//4的倍数是,假设它们不是100的倍数。
如果(第%4年==0)
返回true;
//其他的都不是。
返回false;
}
当然,理想的解决方案可能只是使用GregorianCalendar.isLeapYear(int year)
,并有文档记录。很少需要编写这样一段基本的代码(家庭作业除外),因为Java类库提供了大量有用的东西
整个类的所有优点(包括更改Julian Gregorian转换日期的能力)都被记录在案。如果确定进入无限递归,则在不更改参数的情况下调用您自己的方法,再次调用您的方法,直到堆栈耗尽空间
您可以询问返回语句,这就是您可以改进代码和修复递归的地方
通常,尝试只使用一条返回语句。在这种情况下,这样做将导致:
public boolean isLeapYear() {
// No leap years before Greg the Pope.
if ( year < 1583 )
return false;
// Multiples of 400 are leap years.
if ( year % 400 == 0)
return true;
// Multiples of 100 (other than multiples of 400) are not.
if ( year % 100 == 0)
return false;
// Multiples of 4 are, assuming they're not multiples of 100.
if ( year % 4 == 0)
return true;
// All other aren't.
return false;
}
顺便说一句,我似乎记得闰年也与4的倍数有关:-)在公历之前使用的儒略历的闰年规则是,每四年都是闰年。
公历保留了这一规则,只是增加了整整几个世纪和400年的倍数的例外规则
您的代码只计算例外规则,但没有计算基本规则(除了缺少的返回语句)。选择更可读的缩进样式()。另外,请张贴测试代码;您发布的代码本身没有任何会导致堆栈溢出的内容。为什么要歧视1852年之前的年份?注意:方法名称以小写字符开头。缩进由于一些并发编辑而混乱,我现在稍微修复了它。是的,这种淹没是可怕的,但我可以看到它在学校里被教授,所以我不是真的在抱怨,我只是希望乔伊在某个时候能看到正确淹没的曙光。我认为1852年应该是1582年,这是许多天主教国家采用公历的一年。美国独立后采用了公历。它被追溯采用,这意味着几个世纪以来,在美国有两个日期,一天我们称之为现在,另一天它被称为那天。因此,如果你阅读独立前的文件,你可能正在阅读自该文件编写以来发生变化的日期对我来说,与其说是规则,不如说是指南。特别是如果多返回版本a
public boolean isLeapYear()
{
boolean result = false;
if ( year > 1852 )
{
if ( year % 100 == 0)
{
if ( year % 400 != 0)
{
result = true;
}
}
}
return result;
}