【问题标题】:Compiler asking for return statement when one has been supplied编译器在提供返回语句时要求返回语句
【发布时间】:2013-12-30 17:43:15
【问题描述】:

这应该是结果,一个小程序在等式上找到答案:

a*x + b*y + c*z = d

我仍在研究算法,但它要求我在我有一个返回语句时给出一个返回语句。还是编译器会说,因为当 if 条件的评估为假时,return 语句可能不会被执行?

public static String zoekAlleOplossingen(int a, int b, int c, int d,
                                         int begingrens, int eindgrens) {
    int y = begingrens, z = begingrens;
    for (int x = begingrens; x < eindgrens; ++x) {
        if (((a*x) + (b*y) + (c*z)) == d) {
            return "" + a + "*" + x + " + " + b + "*" + y + " + " + c + "*" + z
               + " = " + d + "";
        }
    }
}

对于那些询问我为什么使用退货的人(请有人嵌入图片)。这是一个 UML 图,您可以清楚地看到在本练习中希望在此方法中使用字符串作为返回类型。:

http://i41.tinypic.com/s62a06.jpg

【问题讨论】:

  • if 语句在for 循环的整个持续时间内没有被执行时,你的函数会发生什么?在这种情况下,函数会返回什么?
  • 你不想在循环中有一个return,当它到达时,函数将立即退出,除非你打开;你想要返回 1 行。它要求您将return 放在循环之外,因为如果您不进入循环并且满足if 的条件,则永远不会到达return
  • @splrs 是正确的。您是否打算多次调用此函数以获得预期结果?否则,您应该简单地打印出结果而不是返回它。
  • 一些建议 - 您的大部分问题只是对您所询问的实际问题的干扰。将来,您应该只询问手头的问题。以这个问题为例 - 您可以删除函数参数,简化 if 语句条件、for 循环边界和 return 语句,然后给我们(而不是告诉我们您的代码打算解决什么问题)并询问为什么编译器会说它所说的。此外,您应该包含完整的、实际的错误消息,而不是仅仅解释它。也可以随意编辑这个问题 - 从长远来看,问题都在这里。
  • @bblincoe 感谢您的回复。正如我所想的那样,正如你们确认的那样,不一定会执行返回,这会导致错误。我知道您只能在方法中返回一个值。但是是否可以在一种方法中使用多个具有相同值的返回值?

标签: java


【解决方案1】:

“或者编译器是否会说,因为当 if 条件的评估为假时,return 语句可能不会被执行?”

正确,编译器总是希望有一些返回语句,即使条件失败。这就是您遇到此编译问题的原因。

【讨论】:

  • 你是唯一回答我确切问题的人。因此我的“坏”帖子。谢谢。不过我现在有第二个问题:)
【解决方案2】:

如果您的if 语句未被评估为真,那么您永远不会得到返回语句。当您的 if 语句评估为 false 时,您需要添加一个来处理这种情况。

public static String zoekAlleOplossingen(int a, int b, int c, int d, int begingrens, int eindgrens){
int y=begingrens,z=begingrens;
for (int x=begingrens;x<eindgrens;++x){
    if ( ((a*x)+(b*y)+(c*z))==d){
        return ""+a+"*"+x+" + "+b+"*"+y+" + "+c+"*"+z+" = "+d+"";
    }
    return "Didn't Work"; //Add a default return string here
}

}

【讨论】:

  • 感谢您提到,只要您在一个方法中拥有相同类型的数据,您就可以使用多个返回。不知道。
【解决方案3】:

您有一个返回语句,但它仅在满足 if 条件时执行。因此,有时执行会导致不返回。编译器会注意到并且不会让您做错。试试这个:

public static String zoekAlleOplossingen(int a, int b, int c, int d, int begingrens, int eindgrens){
int y=begingrens,z=begingrens;
String output="";
boolean isFirst=true;
for (int x=begingrens;x<eindgrens;++x){
    if ( ((a*x)+(b*y)+(c*z))==d){
        if(isFirst){
          isFirst=false;
        }else{
          output+="\n";
        }
        output+= ""+a+"*"+x+" + "+b+"*"+y+" + "+c+"*"+z+" = "+d+"";
    }
 }
 return output;
}

这就是您问题的简单答案。现在是提示。

一般来说,从你的方法中找到一条出路是明智的。它减轻了调试的痛苦。所以即使你看到其他程序员的代码有多次返回,也要尽量避免。

如果您要连接字符串。请改用 StringBuilder,因为它的性能更好。

StringBuilder buffer=new StringBuilder();
buffer.append(a)
  .append("*")
  .append(x)
  .append("+")
  .append(b)
  .append("*")
  .append(y)
  .append("+")
  .append(c)
  .append("*")
  .append(z)
  .append("=")
  .append(d);

我猜你试图能够一眼就注意到,可能是因为你正在打印字符串,条件得到满足。我会编写如下方法并在外面执行for循环。

public static String zoekAlleOplossingen(int a, int b, int c, int d, int begingrens, int eindgrens){
int y=begingrens,z=begingrens;
StringBuilder buffer=new StringBuilder();
buffer.append(a)
  .append("*")
  .append(x)
  .append("+")
  .append(b)
  .append("*")
  .append(y)
  .append("+")
  .append(c)
  .append("*")
  .append(z)
  .append("=")
  .append(d);
   buffer.append("; is ").append((a*x)+(b*y)+(c*z)==d));
   return buffer.toString();
}

最后,这段代码很可能是用于测试的。有空的时候看看 JUnit。你不必再打印出来了。

注意:对于所有代码,请检查格式是否正确,我已在 stackoverflow 编辑器中内联编写,没有进行验证。

【讨论】:

  • 据我所知,优化器可能会以任何方式将 OP 的代码转换为使用 StringBuilder,因此您必须编写过多的附加代码才能强制 StringBuilder be used 可能是不必要的。此外,也许更重要的是,不要及早优化 - 只需先以简单的方式做事,然后如果该段代码的性能存在问题,请对其进行优化。将字符串连接转换为StringBuilder 可能只是在浪费时间。
  • 猜猜对于那段代码,您既不需要优化,也不需要单个退出或 JUnit。但是当我开始接触新事物时,我喜欢被指向正确的方向。这就是为什么所有这些都是作为提示而不是主要回应发布的。无论如何,这些都是零努力的事情,可以让你的工作更好。你不这么认为吗?
  • @dceredo 我知道 JUnit,但我们没有按照老师的要求在这个练习中使用它。正如你所说,我通常想要一个方向和提示而不是优化,因为我在这些课程的前半年。我从未听说过 iof StringBuilder 等。但感谢您提供避免多次退货的提示:)
  • 当然,指出这些东西很好,但它们也应该带有免责声明(例如我之前的评论)。虽然我不会真正调用使用StringBuilder 进行字符串连接或设置JUnit 测试“零努力”。虽然有些人不同意,但单次退出并不是我会在任何地方都应用的东西 - 有时它的好处可以忽略不计,而且它实际上会损害可读性。
猜你喜欢
  • 2016-07-31
  • 2018-03-18
  • 1970-01-01
  • 2015-06-01
  • 1970-01-01
  • 2014-08-20
  • 1970-01-01
  • 2015-09-19
  • 1970-01-01
相关资源
最近更新 更多