在void方法末尾使用return语句的含义是什么?

12

我知道 void 方法不会返回任何值,但我仍然可以编写以下代码:

void nothingDohere() {return;}
所以,"void" 如何与此处的 "return" 语句一起使用?
7个回答

13
一个没有返回值的 return 语句只能在 void 方法(或构造函数)中使用,并且仅执行返回中的“立即退出方法”部分。将带有值的 return 语句视为具有两个目的:

  • 通过 finally 块终止当前方法的执行
  • 使在方法中计算的值可供调用者使用

void 方法中的 return 语句仅实现了第一个目的;第二个目的在 void 方法中没有意义。

来自Java语言规范的14.17章节

不带表达式的 return 语句必须包含在声明为使用关键字 void 不返回任何值(§8.4)的方法或构造函数(§8.8)的主体中。如果 return 语句出现在实例初始化程序或静态初始化程序中(§8.7),则会发生编译时错误。不带表达式的 return 语句尝试将控制转移给包含它的方法或构造函数的调用者。要精确地说,不带表达式的 return 语句总是突然完成,原因是没有返回值的返回。


2
我正式声明,我无法击败Jon Skeet。 - Buhake Sindi
如此简单的问题,却有如此详尽的解释,太棒了!@Jon 您可以在 Stack Overflow 上发布您所提供的所有答案的书籍,或者可能是多本书。 :-) - kaps
@kaps:我的下一本书可能会是我对开发思路的大脑倾泻 :) - Jon Skeet

5

你的返回语句没有参数,因此它不会返回任何内容,因此返回值为 "void"。


1
在方法中的任何时候,当执行返回语句时,它会简单地退出该方法。因此,在这里使用return只是结束了你的方法的执行。
如果你尝试从一个无返回值的方法中返回某个值(例如return "xzy";),你会得到编译错误:
无返回值的方法不可返回值

0

return语句也可以用于使程序返回到调用此方法的位置。因此,return语句将立即终止执行它的方法。

因此,您的示例代码:

void nothingDohere() {
    return ;
}

终止方法调用并立即返回到该方法的调用者。


0
在您提到的情况下,返回值确实是语义上多余的(尽管在语法上需要-没有这个返回值,Javac将无法编译)。返回值终止了该方法。
然而,在某些情况下,希望在一个方法中有多个退出点,例如:
public void doDifferentThings(){
    if(){
        //something done
        return;
    }
    else{
        //something else done
        return;
    }
}

有些人认为这是不好的设计(与单一出口相矛盾),但它可以使您的代码更清晰。


0
简单来说,它会从void方法内部返回到程序调用该方法的位置:
public calss Test
{
    private boolean flag = true;
    public Test()
    {
        ...  // (1)
        ...  // (2)
        voidMethod();  // (3)
        ...  // (7)
        ...  // (8)
    }
    private void voidMethod()
    {
        ...  // (4)
        ...  // (5)
        if(flag) return;  // (6)
        ...
        ...
    }
}

0

当你从一个函数返回时,你将控制权返回给调用返回函数的函数。如果你返回一个值,调用函数将得到该值,否则调用函数只能得到控制权。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接