2016-11-16 79 views
1

我做了一个将日,月,年转换为儒略日的程序。如何更有效地处理错误?

 int year, month, day; 

      do 
      { 
       System.out.print("Enter the year "); 
       year = keyIn.nextInt(); 
        if(year < 1) 
        { 
         System.out.println("Invalid year entered!"); 
         System.out.println(" "); 
        } 
      }while(year < 1); 
      do 
      { 
       System.out.print("Enter the month "); 
       month = keyIn.nextInt(); 
        if(month < 1 || month > 12) 
        { 
         System.out.println("Invalid month entered!"); 
         System.out.println(" "); 
        } 
      }while(month < 1 || month > 12); 
      do 
      { 
       System.out.print("Enter the day "); 
       day = keyIn.nextInt(); 
        if(day < 1 ||day > 31) 
        { 
         System.out.println("Invalid day entered!"); 
         System.out.println(" "); 
        } 
      }while((month == 4 && day > 30) || (month == 2 && day > 29) || day < 1 ||day > 31); 
       keyIn.close();    
        int [] daysInAMonth = {31,28,31,30,31,30,31,31,30,31,30,31}; 

         if(year % 4 == 0 && year % 100 != 0) 
         { 
          daysInAMonth[1] = 29; 
         } 
         else if(year%400==0 && year%100==0) 
         { 
          daysInAMonth[1] = 29; 
         } 
         else 
         { 
          daysInAMonth[1] = 28; 
         } 
          int julianDays = 0; 
           for (int i=0; i < month-1; i++) 
           { 
            julianDays += daysInAMonth[i]; 
           } 
            julianDays += day; 
          System.out.println("The Julian Day is " +julianDays); 

但是,当用户输入的日期,如2001年3月(2001年,4,31)月31日我已经遇到了一些问题,因为有4月份只有30天。
有没有更有效的方式来处理这些错误,而不是试图在用户输入日期时测试do-while循环中的所有内容?

+0

3月有31天,实际上,你可以用4月份来提问。 – Massimo

+0

Java的'Calendar'实际上可以容忍数天或数月等超出限制的内容,并且会尽可能地翻身。我并不是说这肯定是要走的路,但如果你不想处理它,“日历”可能会使这成为可能。 –

+0

@Massimo我的意思是四月,你是对的,对不起。 – Mano

回答

2

我猜你的代码的主要观点是学习如何做到这一点。为此目的,它是ok

当然,如果我们将谈论“现实世界制作”的代码,你的代码不会做:

  1. 您避免重新发明了存在于标准库的东西轮。而Java实际上有几个日期/时间API。 (你会看到使用Java8添加的最新东西)
  2. 你应该避免把所有这些代码放到一个地方。代替;你可以创建辅助方法。

像:

private boolean isYearValid(int year) { 
    return (year > 1); 
} 

private void boolean isMonthValid(... 

当然的,但是,为了验证你就需要通过月份和年份,也是当天的信息。

这里的要点是:验证日期 a 复杂承诺。因此,您无法避免使用繁重的if/else检查来放置复杂的代码。但重点是:您仍然应尽可能使代码尽可能为易读

而且很多人认为有很小的方法,用有意义的名称,甚至是简单的事情,如:

boolean isLeapYear(int year) 

将帮助你实现这一目标。因此,不要使用检查一年是否为闰年的代码来混淆直接验证代码,而只需调用isLeapYear(year)即可。这并不会让复杂检查本身消失,但是您可以将其移出验证方法的上下文!

+0

谢谢你的回答,我会接受你的回答,因为我的问题中的材料只是准备考试,因此我不能使用任何其他类。 – Mano

+0

Ý非常欢迎。感谢您的及时接受! – GhostCat

-1

所以你想让用户只输入数字?在这种情况下,把你的整个代码这里面:

try{ 
//code here 
} catch(InputMismatchException ex) { 
    System.out.println("Please enter numbers only."); 
} 

InputMismatchException检查是否值将被分配给一个变量是该变量的数据类型兼容。

编辑:哎呦。对不起,我以为你问一个更简单的方法来检查用户输入是否是一个数字。但您仍然可以使用trycatch

+0

怎么样输入40? OP希望获得更有效的验证码,而不是限制用户。 –

0

您可以使用java.util.Calendar,它可以帮助你做到这一切。 例如,创建一个日历,设置年份和月份并使用getActualMaximum。

Calendar c=Calendar.getInstance(); 
    c.set(2012, 3, 1); 
    System.out.println(c); 
    System.out.println(c.getActualMaximum(Calendar.DAY_OF_MONTH)); 

打印

太阳4月1日10点31分44秒CEST 2012

新java8日期时间API还了一些解决方案,请参阅Number of days in particular month of particular year?

+1

我绝对不会建议去日历。为什么新手应该首先了解这种不足的旧方法。你最好在这里颠倒顺序:首先讲述新的闪亮合理的Java8 API,然后可能会提到那里还有生锈的危险日历东西。 – GhostCat