Java中的海关toString没有给出所需的输出和抛出错误

时间:2013-11-09 15:26:45

标签: java date boolean comparable

我正在用Java编写一个程序,根据公历来接受和验证日期。我对错误条目的公共布尔setDate(String aDate)函数假设将boolean goodDate变量更改为false。该变量假设在调用时告诉toString函数输出“Invalid Entry”但它没有。我的公共布尔setDate(int d,int m,int y)函数工作正常。我只将问题部分作为一长串代码包含在内。感谢

 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";
    }

  }

谢谢

2 个答案:

答案 0 :(得分:0)

此代码的一个主要问题是您的toString()函数修改了程序的状态(通过将goodDate设置为true)。问题是toString可以在代码中的任何地方被调用,即使你没有明确地调用它。所以,我愿意打赌其他人正在调用它并将goodDate设置为true。看看你是否能找到一种方法使toString()功能不改变状态。

答案 1 :(得分:0)

在第三方库中更容易做到,Joda-Time 2.3。在实例化新的DateTime实例时,如果将无效值传递给构造函数,则该类会抛出异常。

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

示例源代码:

  • 发票类,只是放置方法以尝试潜在新日期时间的有效性的地方。
  • 实例化Invoice的其他代码然后调用有效性方法。
// © 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及相关问题......

// 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