【问题标题】:Error "this method must return a result of type int"?错误“此方法必须返回 int 类型的结果”?
【发布时间】:2014-12-01 02:04:18
【问题描述】:

我在下面有这段代码,它一直告诉我 Thanksgiving() 必须返回一个 int 类型的结果。我已经确定了所有结果以确保,但似乎没有任何效果!为什么我会收到此错误?

public class Thanksgiving
{
private static final int YEAR = 2000;  // first valid year for this method
private static final int NOV1 = 3;     // 2000/11/01 falls on a Wednesday
private static final int THURS = 4; // (Sun = 0, Mon = 1, ..., Sat = 6)

// Precondition: year > 1999
public static int thanksgiving(int year)
{
  int day = firstOfMonth( year );
  if ( day == THURS ) 
  {
    return (int) 22;
  }
  if ( day > THURS )
  {
    return (int) 29 - ( day - THURS );
  }
  if ( day < THURS )
  {
    return (int) 22 + ( THURS + day );
  }
}
public static int firstOfMonth(int year)
{
  int raw = year - 2000;
  int day = NOV1;
  for(int i = 0; i < raw; i++ )
  {
    if( i % 4 == 0 )
    {
      day = day + 2;
    }
    else
    {
      day++;
    }
  }
  return day % 7;
}

public static void main(String[] args)
{

    for(int year = 2000; year <= 2100; year++)
    {
        System.out.print("T'giving " + year + " is Nov " + thanksgiving(year) + "; ");
        if (year % 3 == 1)
        {
            System.out.println();
        }
    }
}

}

【问题讨论】:

    标签: java compiler-errors


    【解决方案1】:

    在这段代码中:

    public static int thanksgiving(int year)
    {
      int day = firstOfMonth( year );
      if ( day == THURS ) 
      {
        return (int) 22;
      }
      if ( day > THURS )
      {
        return (int) 29 - ( day - THURS );
      }
      if ( day < THURS )
      {
        return (int) 22 + ( THURS + day );
      }
    }
    

    您在多个 if 块中创建 return 语句。如果它们都不是真的呢?编译器不允许这样做,您应该在底部返回默认值或抛出异常。或者做一些 if 语句 else - if 和最后一个 else:

    public static int thanksgiving(int year){
      int day = firstOfMonth( year );
      if ( day == THURS ) {
        return (22;
      } else if ( day > THURS ) {
        return 29 - ( day - THURS );
      } else { // else without the if
        // we know that ( day < THURS )
        return 22 + ( THURS + day );
      }
    }
    

    还有:

    • 无需将 int 转换为 int。
    • 一个不相关的问题是您的代码使用了很多“魔术”数字,而您希望避免使用它们。

    【讨论】:

      【解决方案2】:

      问题是所有的 return 语句都在 if 语句中。如果由于某种原因,day != Thursday,而不是 thursday(我知道这是不可能的),则不会返回任何内容。将您的代码更改为具有默认返回值:

      public static int thanksgiving(int year)
      {
        int day = firstOfMonth( year );
        if ( day == THURS ) 
        {
          return (int) 22;
        }
        else if ( day > THURS )
        {
          return (int) 29 - ( day - THURS );
        }
        else 
        {
          return (int) 22 + ( THURS + day );
        }
      }
      

      【讨论】:

        【解决方案3】:

        你需要这样的东西

        public static int thanksgiving(int year)
        {
            int day = firstOfMonth( year );
            if ( day == THURS )
            {
                return (int) 22;
            } else if ( day > THURS )
            {
                return (int) 29 - ( day - THURS );
            } else {
                return (int) 22 + ( THURS + day );
            }
        }
        

        【讨论】:

          【解决方案4】:

          thanksgiving() 方法中有 3 个 if 语句。如果没有一个条件得到满足怎么办?在那种情况下会返回什么?所以编译器在抱怨。

          【讨论】:

            【解决方案5】:

            所有的返回都在 if 语句中,在这种情况下,编译器会看到函数可能不会返回任何内容。您需要在任何 if 之外或在 else 语句中添加一个 return。

            【讨论】:

              【解决方案6】:

              Java 编译器太愚蠢了,无法意识到在每种情况下,您的条件之一都会得到满足。它看到 if 语句并认为它们可能都不满足。可以在方法末尾添加return表示错误情况,可以抛出异常,也可以assert false

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2018-03-08
                • 1970-01-01
                • 2013-09-02
                • 1970-01-01
                • 2017-02-25
                • 1970-01-01
                • 2013-12-18
                • 2015-09-25
                相关资源
                最近更新 更多