返回; (无值) 代表什么意思?

12
我是一名有用的助手,可以为您翻译文本。

我提取了某人的APK(Android应用程序)以查看Java源代码,并看到了很多return;代码,甚至在void方法中也有。

例如:

public void doSomething(){
do{
    return; //This line makes the code below unreachable and can't compile in Eclipse
    switch(num){
        ...
        default:
            return;
    }
}while(...)
...
}

为什么这个应用在我的手机上运行得很好?

我猜 return; 就像是从方法中退出的快捷方式,对吗?


2
反编译器并非总是完美的。 - FThompson
1
每个方法最终都会返回。因此,具有void返回类型的方法可以选择return;或将其省略。这不是必需的,而是一个偏好问题。 - squiguy
2
可能是重复内容:https://dev59.com/ZHRB5IYBdhLWcg3wAjbR - Chetter Hummin
@Vulcan 所以它们是代码的损坏部分? - hrsetyono
1
@squiguy,这不仅仅是个人喜好的问题。它有一个有用的目的,即异常无法实现的 - 它可以让你在不中断执行路径的情况下结束它。我的意思是,你可以返回并继续下一行的调用之外,而不是抛出异常,并进入第一个catch语句中完全不同的执行路径。因此,虽然它不是void方法中始终需要的,但它仍然超出了个人喜好的范畴。 - Richard Barker
4个回答

25
如果方法返回void,则return;语句只会在该语句处退出方法,不会执行后续语句。

@HussainAkhtarWahid 是的,我认为它没有返回任何东西。 - hrsetyono

11

是的,没错。看一下 http://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html 的底部:

返回语句

分支语句中的最后一个是返回语句。返回语句从当前方法退出,并且控制流返回到调用该方法的位置。返回语句有两种形式:一种返回值,一种不返回值。要返回一个值,只需在 return 关键字之后放置该值(或计算该值的表达式)。

return ++count; 返回值的数据类型必须与方法声明的返回值类型匹配。当方法声明为 void 时,使用不返回值的 return 形式。

return;


谢谢!我从来不知道void方法也可以使用return - hrsetyono

3
回答你的第一个问题:我假设这段代码是反编译得来的。需要注意的是,反编译器并不是将二进制dex代码一对一转换成生成这些二进制代码的Java代码的工具。它们通常会遇到解析不同控制结构(如循环和开关)的问题。此外,二进制代码可能已经被混淆,这意味着在编译后,二进制代码被修改以使其完全可操作,但更难以反编译和逆向工程化(基本上是为了防止你在这里所尝试的事情 :))。它们可以添加死代码,比如不应该存在的返回语句,混淆循环和if语句来混淆反编译的代码等等。

谢谢,这解释了为什么所有的 forwhile 循环似乎都有问题。 - hrsetyono

1

return关键字基本上用于void方法中,它有助于打破条件语句并退出方法。


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