2013-11-09 31 views
1

我正在用Java编写一个程序来接受和验证根据公历的日期。我的公共布尔setDate(String aDate)函数为一个不正确的条目是假设更改布尔goodDate变量为false。该变量假设在调用时告诉toString函数输出“Invalid Entry”,但它不会。我的公共布尔setDate(int d,int m,int y)函数工作正常。我只将问题部分作为一段代码。由于Java中的海关toString没有给出所需的输出和抛出错误

public boolean setDate(int day, int month, int year){ 
    // If 1 <= day <= 31, 1 <= month <= 12, and 0 <= year <= 9999 & the day match with the month 
    // then set object to this date and return true 
    // Otherwise,return false (and do nothing) 
    boolean correct = isTrueDate(day, month, year); 
    if(correct){ 
     this.day = day; 
     this.month = month; 
     this.year = year; 
     return true; 
    }else{ 
     goodDate = false; 
     return false; 
    } 
    //return false; 
} 

public boolean setDate(String aDate){ 
    // If aDate is of the form "dd/mm/yyyy" or "d/mm/yyyy" 
    // Then set the object to this date and return true. 
    // Otherwise, return false (and do nothing) 
    Date d = new Date(aDate); 
    boolean correct = isTrueDate(d.day, d.month, d.year); 
    if(correct){ 
     this.day = d.day; 
     this.month = d.month; 
     this.year = d.year; 
     return true; 
    }else{ 
     goodDate = false; 
     return false; 
    } 
} 

public String toString(){ 
    // outputs a String of the form "dd/mm/yyyy" 
    // where dd must be 2 digits (with leading zero if needed) 
    //  mm must be 2 digits (with leading zero if needed) 
    //  yyyy must be 4 digits (with leading zeros if needed) 
    String day1; 
    String month1; 
    String year1; 
    if(day<10){ 
     day1 = "0" + Integer.toString(this.day); 
    } else{ 
     day1 = Integer.toString(this.day); 
    } 
    if(month<10){ 
     month1 = "0" + Integer.toString(this.month); 
    } else{ 
     month1 = Integer.toString(this.month); 
    } 
    if(year<10){ 
     year1 = "00" + Integer.toString(this.year); 
    } else{ 
     year1 = Integer.toString(this.year); 
    } 
    if(goodDate){ 
    return day1 +"/" +month1 +"/" + year1; 
    }else{ 
     goodDate = true; 
     return "Invalid Entry"; 
    } 

    } 

谢谢

回答

0

这段代码的主要问题是,你的toString()函数修改程序的状态(通过设置goodDate为true)。问题是toString可能会在你的代码中的任何地方被调用,即使你没有明确地调用它。所以,我愿意打赌别的什么叫它,并设置goodDate为真。看看你是否能找到一种方法使toString()函数不会改变状态。

0

在第三方库中做起来容易多了,Joda-Time 2.3。在实例化新的DateTime实例时,如果将无效值传递给构造函数,则该类将引发异常。下面

代码使用Multi-Catch Exceptions新功能的Java 7中

示例源代码:

  • 发票类,只是一些地方放尝试的潜在的新日期,时间有效性的方法。
  • 实例化发票然后调用有效性方法的其他代码。
// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so. 

public class Invoice { 

    Boolean isDateTimeValid (int year, int month, int day) { 
     org.joda.time.DateTimeZone losAngelesTimeZone = org.joda.time.DateTimeZone.forID("America/Los_Angeles"); 
     try { 
      org.joda.time.DateTime dt = new org.joda.time.DateTime(year, month, day, 0, 0, losAngelesTimeZone); 
      return true; // No exception thrown, so this must be a valid date-time. 
     } catch (org.joda.time.IllegalFieldValueException e) { 
      return false; // Oops, invalid values used as input. 
     } catch (Exception e) { 
      System.out.println("ERROR Encountered an unexpected Exception: " + e.getStackTrace()); 
      return false; 
     } 
    } 

} 

代码中的任何地方调用该方法的有效性。

Invoice invoice = new Invoice(); 
System.out.println("Is valid date for 2013, 11, 15: " + invoice.isDateTimeValid(2013, 11, 15)); 
System.out.println("Is valid date for 2013, 99, 15: " + invoice.isDateTimeValid(2013, 99, 15)); 

运行时...

Is valid date for 2013, 11, 15: true 
Is valid date for 2013, 99, 15: false 

关于乔达,时间及相关事宜...

// Joda-Time - The popular alternative to Sun/Oracle's notoriously bad date, time, and calendar classes bundled with Java 7 and earlier. 
// http://www.joda.org/joda-time/ 

// Joda-Time will become outmoded by the JSR 310 Date and Time API introduced in Java 8. 
// JSR 310 was inspired by Joda-Time but is not directly based on it. 
// http://jcp.org/en/jsr/detail?id=310 

// By default, Joda-Time produces strings in the standard ISO 8601 format. 
// https://en.wikipedia.org/wiki/ISO_8601 

// About Daylight Saving Time (DST): https://en.wikipedia.org/wiki/Daylight_saving_time 

// Time Zone list: http://joda-time.sourceforge.net/timezones.html