【问题标题】:Why does my compiler say that my return statement is missing?为什么我的编译器说我的 return 语句丢失了?
【发布时间】:2017-09-06 12:05:35
【问题描述】:

我在 if 和 else 两种情况下都输入了 return 语句

但还是说缺少return语句

我的代码有什么问题?

public static getNext(){
    ArrayList<String> copy = new ArrayList<String>();
    Random dice = new Random();
    int rolls;
    for(int x=0; x<i.length; x++){
        copy.add(i[x]);
    }

    if(copy.size() < 1){
        return "NONE";
    }

    else{
        rolls = dice.nextInt(copy.size());
        return copy.get(rolls);
        copy.remove(rolls);
    }
}

【问题讨论】:

  • return copy.get(rolls); copy.remove(rolls); 来吧,真的吗?这应该如何工作?
  • copy.remove(rolls) 是无法访问的代码;仅此一项就应该出错。
  • public static getNext(){
  • 使用return copy.remove(rolls);ArrayList#remove(int index) 返回删除的元素。
  • 我猜编译器只是因为语法混乱而吐出错误的错误信息。如果只是那个问题,它应该提出“无法访问的代码”。但在此之前,您的方法缺少返回类型,这也会导致缺少返回类型的正确错误消息。所以我的猜测是该类中可能存在更多语法问题。

标签: java if-statement return void


【解决方案1】:

您的代码中有一些误解:

首先当您返回时,该方法应该返回一些东西
其次您不能在 return 之后指定任何类型的语句
第三您必须存储要删除的返回值并将其返回到单独的变量中

您的代码应如下所示:

public static String getNext() {
//-------------^^------------return type
    ArrayList<String> copy = new ArrayList<String>();
    Random dice = new Random();
    int rolls;
    for (int x = 0; x < i.length; x++) {
        copy.add(i[x]);
    }

    if (copy.size() < 1) {
        return "NONE";
    } else {
        rolls = dice.nextInt(copy.size());
        String s = copy.get(rolls);//<<----------put the val you want in separate variable
        copy.remove(rolls);//<<-----------remove your val
        return s;//<<-----------return your val
    }
}

注意

就像评论中提到的@BackSlash一样,从列表中删除您的 val 是没有用的,因为在您退出方法后它将不会使用它,因此如果您在其他地方使用此列表,则必须在外面声明它例如你的方法:

private static ArrayList<String> copy = new ArrayList<String>();
public static String getNext() {
    //ArrayList<String> copy = new ArrayList<String>();//<<<-------------useless position
    ....

【讨论】:

  • 我还要注意,保存copy.get(rolls); 的副本并将其从列表中删除是完全没有用的,因为该列表将在方法执行结束后被销毁。 return copy.get(rolls); 就好了
  • 嗯,是的,这是正确的@BackSlash,直到列表在方法中,谢谢,如果你不介意,我会在我的回答中提到这一点
  • 我不明白为什么人们似乎没有看到编译器消息实际上应该是另一个。我的结论是问题中未显示的代码中存在更多语法缺陷。该 sn-p 不应导致“缺少返回语句”。它应该会导致“缺少返回 type”并且可能是“无法访问的代码”...
  • @YCF_L 好吧,我不是“编译器专家”,您是对的,这很可能取决于您使用的是哪一个。也许这也是一个因素,它是一个静态方法。关键是 - 在任何情况下都不应该是“缺少返回 statement”。我认为这是编译器完全弄乱了这里的语法结构并且不能依赖错误消息的暗示。首先必须修复明显的错误。
  • 顺便说一句:您的 ideone 链接,当我点击它时,它显示 Main.java:16: error: invalid method declaration; return type required public static getNext() { - 这正是我所期望的。
【解决方案2】:
else{
        rolls = dice.nextInt(copy.size());
        return copy.get(rolls);
        copy.remove(rolls);   <--- UNREACHABLE
}

您的编译器可能由于返回后无法访问的代码行而错过了返回语句。

另外,您还没有声明返回的类。应该有:

public static <return type> methodName(<parameters>) {

<body>

}

问:返回后如何删除 copy.get(rolls)?有没有办法?
答:基本上问题是关于函数的概念。函数是一段代码,它执行一些逻辑,然后基于它返回一些东西。 Return 语句是函数中发生的最后一件事。

你也可以有一个不返回任何东西但接受参数的代码块。这些被称为程序。无论如何,在 Java 中我们都称它们为:函数和过程方法

【讨论】:

  • 返回后如何删除 copy.get(rolls)?有办法吗?我没有输入任何参数,因为问题具体是这样说的。
  • @JFreders 我会在答案中回复
  • 您似乎在这里感到困惑。你不需要删除任何东西。当该方法终止时,集合将超出范围并被垃圾回收,保存返回的一个元素,假设调用代码具有对它的引用。
  • @JFreders 您可以通过单击答案分数下方的灰色勾号将答案标记为正在解决的问题。
  • @JFreders 编译器错误消息 - 它实际上是“缺少返回 statement”还是“缺少返回 type”?
猜你喜欢
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
  • 2023-03-12
  • 2015-08-26
相关资源
最近更新 更多