【问题标题】:Simple return statement error简单的return语句错误
【发布时间】:2015-09-27 22:01:55
【问题描述】:

我正在尝试制作一个程序,该程序可以为您输入的任何数字等级返回字母等级,但 java 一直告诉我我缺少返回语句。我尝试将 char 更改为 void 为 int,但这些都不起作用。我还是一个新手,所以任何帮助将不胜感激。

class Grades
{

public static char getGrade(int x)
{
    char A, B, C, D, F;
    if((x>=90) && (x<=100))
        return 'A';
    if((x>=80) && (x<=89))
        return 'B';
    if((x>=70) && (x<=79))
        return 'C';
    if((x>=65) && (x<=69))
        return 'D';
    if(x<65)
        return 'F';
}

public static char getGrade(int y, int z)
{
    int w = ((y + z)/2);
    return getGrade(w);
}

public static void main(String[] args)
{
    System.out.println("64 gets the grade " + getGrade(64));
    System.out.println("99 gets the grade " + getGrade(99));
    System.out.println("73 and 91 gets the grade " + getGrade(73,91));
}
}

每次我使用此代码时,我总是收到错误:

Grades.java:17:错误:缺少返回语句 } 这是为什么呢?

【问题讨论】:

  • 如果您的ifs 都不起作用,应该返回什么值(请记住,int x 的编译器可以是0-100 范围之外的值)。
  • 枚举的完美候选者。

标签: java return


【解决方案1】:

您应该始终有 100% 的概率返回某些东西,但这里的情况并非如此。

public int returnAnInt(int a){
    if (a > 0) return 10;
}

此代码不起作用,因为不能保证a 总是优于0。想象一下将-1 作为参数。它会返回什么?

检查更正:

public int returnAnInt (int a){
    if (a > 0) 10;
    else return 0;
}

因为你已经预料到了所有的可能性,所以这将编译。

您可以在这里将F设置为默认返回值:

public static char getGrade(int x)
{
    if((x>=90) && (x<=100))
        return 'A';
    if((x>=80) && (x<=89))
        return 'B';
    if((x>=70) && (x<=79))
        return 'C';
    if((x>=65) && (x<=69))
        return 'D';
    else
        return 'F';
}

它可以在这种情况下工作,但在大多数情况下并不是最佳的。您自己的代码可能会找到最好的修正。

我在这里给了你正确的道路。

【讨论】:

  • 它并没有给你一个“默认”,如果围绕“D”案例的条件失败,它会给你一个选项。
  • 在这种情况下这是默认设置。
  • 我不想误导任何人认为这是为一大堆打开的if 语句提供默认返回值的方法。这是因为它在其余的失败时提供 some 值,但实际上并不是因为它仅在 last 失败的情况下提供值。确实有点技术上的问题,但仍然足以让我有点生气。
  • @Makoto,我明白了。我会编辑答案,但我认为在获得正确路径后找到正确的更正是 OP 的工作。
【解决方案2】:

不保证您的 if 语句会返回任何内容。您必须添加else 或返回一些默认值。

如果要保持代码不变,请将return 'F'; 放在方法的末尾。无需检查是否为F;这是通过消除。

例如,这意味着代码如下所示。

public static char getGrade(int x) {
    if((x>=90) && (x<=100)) {
        return 'A';
    }
    if((x>=80) && (x<=89)) {
        return 'B';
    }
    if((x>=70) && (x<=79)) {
        return 'C';
    }
    if((x>=65) && (x<=69)) {
        return 'D';
    }
    return 'F';
}

作为替代方案,请考虑包含else if 语句,因为这样会更清楚一点。

【讨论】:

  • 他不应该在函数的末尾放置一些其他值,如果上面的代码出现问题,比如在末尾使用 return 0,不会让他感到困惑吗?我认为这是更好的做法
  • 当我使用键盘时,我会编辑这个答案,但在这种情况下没有理由引入虚假的哨兵值。
【解决方案3】:

编译器无法确保有返回。看看下面的例子:

public boolean mod2(int a){
    if(a % 2 == 0)
        return true;
    if(a % 2 != 0)
        return false;
}

此方法将返回任何给定的值,但编译器只能检查 snytax 而不是语义。因此代码不可编译。

如果上述语句都不匹配,您需要类似默认情况的东西。 使用上面的代码,它将是:

public boolean mod2(int a){
    if(a % 2 == 0)
        return true;
    else
        return false; 
}

【讨论】:

    【解决方案4】:

    请注意,您可以使用 TreeMap 避免重复等级边界:

    public static char getGrade(int x) {
        NavigableMap<Integer, Character> grades = new TreeMap<Integer, Character>();
        grades.put(90, 'A');
        grades.put(80, 'B');
        grades.put(70, 'C');
        grades.put(65, 'D');
        grades.put(Integer.MIN_VALUE, 'F');
        return grades.floorEntry(x).getValue();
    }
    

    如果您知道数字等级是非负数,您可以将 Integer.MIN_VALUE 替换为 0 以获得更好的可读性。

    另一方面,如果您希望该方法拒绝高于 100 的数字等级,则需要在该方法的顶部添加一些验证。

    如果成绩计算对性能至关重要,最好只初始化一次地图,在 getGrade 方法之外的某个地方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-07
      • 2013-04-10
      • 2015-07-21
      相关资源
      最近更新 更多