【问题标题】:Why doesn't this program work为什么这个程序不起作用
【发布时间】:2013-01-26 12:05:00
【问题描述】:

我被要求根据某些特定指令编写程序(类)。我觉得我几乎把它记下来了,但我正在做一些愚蠢的事情。我无法弄清楚如何将连字符添加到符号常量中,以便当我键入 INSERT_HYPHEN 时,它会在访问器方法中插入一个“-”。它说不兼容的类型>:( 另外,当我尝试将局部变量“fullDate”插入到“getFullDate”访问器方法中,然后输入“fullDate = year + month + day”时,它表示“不兼容的类型!也许是因为访问方法是一个字符串,我正在尝试在其中添加“整数”。我找不到解决方法。这是我的代码。

public class Date
{
public static final int INSERT_ZERO = 0;
public static final char INSET_HYPHEN = -;   //ERROR incompatible types

// instance variables - replace the example below with your own
private int year;
private int month;
private int day;

/**
 * Default constructor
 */
public Date()
{
    setYear (2013);
    setMonth (01);
    setDay (01);
}

/**
 * 
 */
public Date (int whatIsYear, int whatIsMonth, int whatIsDay)
{
    setYear (whatIsYear);
    setMonth (whatIsMonth);
    setDay (whatIsDay);
}

/**
 *@return year
 */
public int getYear()
{
    return year;
}

/**
 *@return month
 */
public int getMonth()
{
    return month;
}

/**
 *@return day
 */
public int getDay()
{
    return day;
}

/**
 *@return 
 */
public String getFullDate()
{
    String fullDate;
    if (whatIsMonth < 10);    // the year, month, and day all give me incompatible types :(
    {
        fullDate = year + INSERT_HYPHEN + INSERT_ZERO + month + INSERT_HYPHEN +  day; 
    }
    if (whatIsDay < 10);
    {
        fullDate = year + INSERT_HYPHEN +  month + INSERT_HYPHEN +  INSERT_ZERO + day;
    }
    else
    {
        fullDate = year + INSERT_HYPHEN + month + INSERT_HYPHEN + day;
    }
    return year + month + day;
}

/**
 * 
 */
public void setYear (int whatIsYear)
{
    if ((whatIsYear >= 1990) && (whatIsYear <= 2013))
    {
        year = whatIsYear;
    }
    else
    {
        year = 2013;
    }
}

/**
 * 
 */
public void setMonth (int whatIsMonth)
{
    if ((whatIsMonth >=  1) && (whatIsMonth <= 12))
    {
        month = whatIsMonth;
    }
    else
    {
        month = 01;
    }
}

/**
 * 
 */
public void setDay (int whatIsDay)
{
    if ((whatIsDay >= 1) && (whatIsDay <= 31))
    {
        day = whatIsDay;
    }
    else
    {
        day = 01;
    }
}

}

只是为了了解更多背景信息。我正在构建的这个类有三个字段,分别保存年、月和日。年份可以介于 1900 年和当前年份之间(含)。月份可以在 1 到 12 之间 包括的。天数可以介于 1 到 31 之间。我必须在代码中使用符号常量而不是“魔术”数字,例如公共静态最终 int FIRST_MONTH = 1;

默认构造函数将 year 设置为当前年份,将 month 设置为第一个月,将 day 设置为第一天。非默认构造函数测试每个参数。如果年份参数超出可接受范围,则将字段设置为当前年份。如果月份参数超出可接受的范围,它会将字段设置为第一个月。如果 day 参数超出可接受的范围,则将字段设置为第一天。

每个字段都有一个访问器方法和一个修改器方法。所有三个 mutator 方法都检查其参数的有效性,如果无效,则以与非默认相同的方式设置相应的字段 构造函数。

这是我遇到问题的部分。我必须包含一个名为“public String getFullDate()”的方法,它返回一个带有以下格式的日期的字符串:YYYY-MM-DD,例如 2012-01-01。单个数字的月份和日期用前导零填充。 "

任何帮助都将不胜感激,即使只是一个想法:) 谢谢。

【问题讨论】:

  • 对字符 '-' 使用单引号。零也最好是字符。

标签: java


【解决方案1】:

你应该使用单引号:

public static final char INSET_HYPHEN = '-';  

【讨论】:

    【解决方案2】:
        fullDate = String.format("%d-%02d-%02d", year, month, day); 
    

    【讨论】:

      【解决方案3】:

      char 类型只保存用单引号括起来的数据。如果你想使用双引号,那么你的数据类型应该是string

      【讨论】:

        【解决方案4】:

        除了错误声明字符的语法错误之外,您还试图访问在 getFullDate() method 中的构造函数中声明的局部变量

        公共日期(int whatIsYear、int whatIsMonth、int whatIsDay)

        public String getFullDate()
        {
            String fullDate;
            if (whatIsMonth < 10);    // the year, month, and day all give me incompatible  
            //rest of the code 
        }
        

        whatIsMonth , whatIsDay 是在你的构造函数中定义的局部变量,你不能在构造函数之外使用这些变量。

        您的 getFullDate() 方法应该使用您的实例变量yearmonth 和“day”。请注意,int whatIsYear, int whatIsMonth, int whatIsDay 只是构造函数参数,并且仅限于您的构造函数。您无法在构造函数之外访问它们。

        【讨论】:

          【解决方案5】:

          您不能添加字符串文字,如果您想使用上述内容: 然后试试这个

          public static final CHARACTER INSET_HYPHEN = new CHARACTER('-');  
          

          public static final char INSET_HYPHEN = '-';  
          

          【讨论】:

          • 为什么要厌倦创建新对象?什么时候可以只使用“=”?
          【解决方案6】:
          1. 使用public static final char INSET_HYPHEN = '-'; 而不是public static final char INSET_HYPHEN = -; - 字符应始终在撇号之间定义。
          2. 命名常量“INSERT_HYPHEN”没有意义。常量的想法是让以后更容易在代码中找到它的任何位置更改它的值,因此常量的名称应该代表它的值的“滚动”,例如:“SEPARATOR”或“DATE_FORMAT_SEPERATOR”。
          3. 不管怎样,如果任何值应该是常数,那就是年月日的默认值。
          4. 您的默认构造函数与需要年、月和日的构造函数的代码几乎完全相同,在这种情况下,通常最好使用 this(默认参数)从默认值中调用第二个。
          5. getFullDate() 的逻辑是错误的,让String.format 为你做脏活要好得多。此外,getFullDate() 返回的是整数 year + month + day,而不是返回 fullDate
          6. 您可能会感到困惑,但最好将设置器和构造器的参数命名为与目标字段相同的方式,而不是组成一个新名称。为了避免两者之间的歧义,请使用 this.[FIELD_NAME] 来引用实例的字段。

          这段代码应该可以工作:

          public class Date {
              private static final int DEFAULT_YEAR = 2013;
              private static final int DEFAULT_MONTH = 1;
              private static final int DEFAULT_DAY = 1;
              private static final char SEPARATOR = '-';
          
              private int year;
              private int month;
              private int day;
          
              /**
               * Default constructor
               */
              public Date() {
                  this(DEFAULT_YEAR, DEFAULT_MONTH, DEFAULT_DAY);
              }
          
              /**
               * 
               */
              public Date (int year, int month, int day) {
                  setYear(year);
                  setMonth(month);
                  setDay(day);
              }
          
              /**
               *@return year
               */
              public int getYear() {
                  return year;
              }
          
              /**
               *@return month
               */
              public int getMonth() {
                  return month;
              }
          
              /**
               *@return day
               */
              public int getDay() {
                  return day;
              }
          
              /**
               *@return 
               */
              public String getFullDate() {
                  return String.format("%d%c%02d%c%02d", year, SEPARATOR, month, SEPARATOR, day);
              }
          
              /**
               * 
               */
              public void setYear (int year)
              {
                  this.year = ((year >= 1990) && (year <= DEFAULT_YEAR)) ? year : DEFAULT_YEAR;
              }
          
              /**
               * 
               */
              public void setMonth (int month)
              {
                  this.month = ((month >=  1) && (month <= 12)) ? month : DEFAULT_MONTH;
              }
          
              /**
               * 
               */
               public void setDay (int day)
               {
                   this.day = ((day >=  1) && (day <= 31)) ? day : DEFAULT_DAY;
               }
           }
          

          【讨论】:

            猜你喜欢
            • 2016-04-20
            • 2015-05-21
            • 2022-01-17
            • 1970-01-01
            • 2019-12-31
            • 2013-08-09
            • 2015-09-22
            • 1970-01-01
            相关资源
            最近更新 更多