【问题标题】:Error in Java: "missing Return statement"Java 中的错误:“缺少返回语句”
【发布时间】:2015-02-26 15:18:43
【问题描述】:

这部分代码出现编译错误"missing return statement"。不知道为什么?我也知道这是一种低效的写法,所以不要太难判断:)

static int handValue(int card1, int card2){

   if((card1+card2)>=10)
     return 0;

   if((card1+card2)<=10)
     return card1+card2;

   if(card1>=10 && card2<=9 && card2>=1)
     return card2;

   if(card2>=10 && card1<=9 && card1>=1)
     return card1;

}

【问题讨论】:

  • 无论如何你都需要返回一个值。所以你可以在最后加上 return -1 。
  • 编译器不知道你是否拥有所有的可能性。你必须返回某事。如果没有你的条件是真的。 -1 会很好。
  • @Zhdawson,以下任何一个答案有帮助吗?我注意到你已经问了 3 个问题,都收到了答案,但是 not actually marked any answers as accepted。如果答案对您有帮助,请考虑使用复选标记 accepting the most helpful one。这向更广泛的社区表明这是一个有用的答案,并为回答者和您自己带来了一些声誉。

标签: java return


【解决方案1】:

编译器告诉您,您没有针对所有可能的代码路径的return 语句。虽然这在您的情况下是不可能的,但编译器并不是为了解决这个问题而构建的:有问题的路径是没有if 块被传递给card1card2 的值触发的路径.

原则上,您只需在最后添加一个 return 即可防止出现警告。

static int handValue(int card1, int card2){
  if((card1+card2)>=10)
    return 0;   
  if((card1+card2)<=10)
    return card1+card2;    
  if(card1>=10 && card2<=9 && card2>=1)
    return card2;    
  if(card2>=10 && card1<=9 && card1>=1)
    return card1;
  return -1; // example return statement
}

您需要选择一个合适的值来返回。另一种方法是声明该方法应始终匹配其中一个语句,然后只需在方法末尾为IllegalArgumentException 添加一个throw 语句,而不是“默认”返回语句。由于这是一个未经检查的异常,调用者不必遵循 catch/specify 原则。

但是,对于您的代码,只有前两个 if 语句是可能的(总和将始终为 &gt;= 10&lt; 10,因此您可以减少整个逻辑块;虽然我怀疑您不'实际上并不打算这样做,您的方法实际上等同于:

static int handValue(int card1, int card2){
  if((card1+card2)>=10)
    return 0;   
  else // if((card1+card2)<10) <---- note '<10' not '<=10' as in your original code
    return card1+card2;
}

或者只是

static int handValue(int card1, int card2) {
  return ((card1 + card2) >= 10) ? 0 : (card1 + card2);
}

【讨论】:

    【解决方案2】:

    这将起作用:

    static int handValue(int card1, int card2){
    if((card1+card2)>=10)
      return 0;
    
    if((card1+card2)<=10)
      return card1+card2;
    
    if(card1>=10 && card2<=9 && card2>=1)
      return card2;
    
    if(card2>=10 && card1<=9 && card1>=1)
      return card1;
    
     return -1;
    }
    

    如果你定义了一个返回类型,你必须在你的方法的每个可能的路径中提供一个返回类型,或者你必须抛出一个这样的异常:

    static int handValue(int card1, int card2){
    if((card1+card2)>=10)
      return 0;
    
    if((card1+card2)<=10)
      return card1+card2;
    
    if(card1>=10 && card2<=9 && card2>=1)
      return card2;
    
    if(card2>=10 && card1<=9 && card1>=1)
      return card1;
    
     throw new RuntimeException("no cards!!!");
    }
    

    static int handValue(int card1, int card2)throws Exception{
    if((card1+card2)>=10)
      return 0;
    
    if((card1+card2)<=10)
      return card1+card2;
    
    if(card1>=10 && card2<=9 && card2>=1)
      return card2;
    
    if(card2>=10 && card1<=9 && card1>=1)
      return card1;
    
     throw new Exception("no cards!!!");
    }
    

    【讨论】:

    • 那么请随时接受我的回答。点击左上角的白色钩子。
    【解决方案3】:

    您编写函数的方式实际上保证在第一个或第二个 if 语句上终止,因为任何两个数字的总和大于或等于 10 或不是。然而,Java 编译器不够聪明,无法弄清楚这一点,所以它告诉你应该有一个 return 语句,如果所有 if 语句都失败,则该语句会被执行。

    为了修复错误,并确保您的后两个 if 语句实际上可以达到,我将重写该函数:

      static int handValue(int card1, int card2) {
        if (card1 >= 10 && card2 <= 9 && card2 >= 1) {
          return card2;
        } else if (card2 >= 10 && card1 <= 9 && card1 >= 1) {
          return card1;
        } else if ((card1 + card2) <= 10) {
          return card1 + card2;
        } else {
          return 0;
        }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-18
      • 2014-01-09
      • 2014-08-20
      • 2013-04-27
      • 1970-01-01
      • 1970-01-01
      • 2012-11-19
      • 2015-06-01
      相关资源
      最近更新 更多