2016-11-13 88 views
-1

我需要编写一个闰年的方法。所以该方法必须被称为printleap并检查该数字是否是闰年。所以Java程序将通过读取年份号码列表来测试该方法,并仅显示闰年。 这里是我所做的:闰年Java Q

import java.util.Scanner; 公共类Ex1PartAassig3 {

public static int printleap(String string) { 
    Scanner sc1=new Scanner(System.in); 
    { 
     System.out.println("This programe calculates leap year."); 
     int year= printleap ("Enter the year:"); 
     if ((year%4==0)&& year % 100 !=0) 
    } 
    System.out.println(year + "is a leap year."); 
    { 
    else if ((year % 4==0) && (year % 100==0)&&(year % 400==0)) 
    { 
     System.out.println(year +"is a leap year."); 
    } 
    else { 
    } 
     System.out.println(year + " is not a leap year."); 

    } 

} 

} 

正在显示一个错误的领域是强调第一个 '其他' 否则,如果((年%4 == 0)& &(每年100%== 0)& & (年%400 == 0)

和两个大括号,第一只在第二个的System.out 并且在非常bottom.There所述第一支架的上方位于底部3个括号,但其第一1.

有人可以帮助我运行这个程序,或者我忘记了什么,谢谢你?

+1

您的第一个'if'语句后,您立即有一个错误的右括号。花一些时间看看你的括号是在哪里打开和关闭。 – LiXie

+1

这不看起来可疑吗? 'if((year%4 == 0)&& year%100!= 0)}' – Marvin

+0

您的printleap()方法调用您的printleap()方法。这是不必要的。不要打扰要求用户输入一年。首先编写你被要求编写的方法:一个printleap()方法,它需要一年的时间作为参数(所以,一个int,而不是一个String),如果那年是一个闰年,它会打印出来。处理用户输入,如果你必须这样做,应该用单独的方法来完成。您可以先用硬编码的年份调用printleap()方法来测试它。 –

回答

3

你的大括号都在这个地方,不排队。这将是一个固定的版本正确匹配括号:

public static void printleap() 
{ 
    try (Scanner sc1=new Scanner(System.in)) 
    { 
     System.out.println("This programe calculates leap year."); 
     System.out.print("Enter the year:"); 
     int year= sc1.nextInt(); 
     if((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))) 
     { 
      System.out.println(year +"is a leap year."); 
     } 
     else 
     { 
      System.out.println(year + " is not a leap year."); 
     } 
    } 
} 

编辑:还更新了if语句使用下面的答案的情况下,因为一个在最初的代码确实是有缺陷的。闰年必须是能被4整除,但一年也就是100整除仅仅是一个闰年,如果它也是400

+0

这究竟是“固定的”?它甚至没有编译。 –

+0

你说得对,我只是修正了那个错位的大括号。为了编译它,他还必须修复方法签名。更新了答案,以照顾到这一点。 –

+0

好的,我已经退出了我的downvote。这编译和正确运行。 –

1

你的条件是错误的整除...

它必须是

if((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))) 
+0

不,这是关于原始程序没有错误的事情之一。 OP只是简单地将这种情况分解为三种情况。但是他们确定哪些年份是闰年的逻辑其实是正确的。 –

+0

感谢您的意见: – Ciaran

+0

public static int printleap(String string){ \t \t Scanner sc1 = new Scanner(System.in); \t \t { \t \t \t System.out.println(“这个程序计算闰年。“); \t \t \t年整型= printleap(” 输入年份:“); \t \t \t如果((年%400 == 0)&&((年%4 == 0)&&(年%100! = 0))) \t \t \t { \t \t的System.out.println(年+ “为闰年。”); \t \t \t} \t \t否则如果((年%4 == 0)&& (年%100 == 0)&&(年%400 == 0)) \t \t { \t \t \t的System.out.println(年+ “是一个闰年。”); \t \t} \t \t其他{ \t \t} \t \t \t的System.out.println(年+ “是不是闰年。”); \t \t \t } \t \t 返回\t 0; \t}} 对不起 – Ciaran

1

你的逻辑(使用ifelse if)应该如下:

if (year%400 == 0) 
    System.out.println(year+ " is leap year"); 
    else if (year%100 == 0) 
    System.out.println(year+ " is NOT leap year"); 
    else if (year%4 == 0) 
    System.out.println(year+ " is leap year"); 
    else 
    System.out.println(year+ " is NOT leap year"); 
0

使用java.time

有一个class for that

Year.now() 
    .isLeap() 

更好始终指定所需/预期的时区,而不是在JVM的当前默认区域毫无保留地依赖。

Year.now(ZoneId.of("Europe/Paris")) 
    .isLeap() 

或指定一年。

Year.of(2017) 
    .isLeap() 

关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代了日期时间类legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time项目现在位于maintenance mode,建议迁移到java.time类。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。规格是JSR 310

从何处获取java.time类?

ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可以在这里找到一些有用的类,如Interval,YearWeek,YearQuartermore