2016-11-16 55 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