“返回”会停止方法的执行吗?
Posted
技术标签:
【中文标题】“返回”会停止方法的执行吗?【英文标题】:Does "return" stop the execution of a method? 【发布时间】:2011-11-12 01:01:59 【问题描述】:我用以下方式编写了一个方法:
if (something)
return 1;
the rest of the code
在我看来,该方法返回 1,然后执行the rest of the code
。这可能是事实吗? return
不会停止代码的执行。不是,如何强制方法停止?
添加
这是代码(根据要求):
for (int i=availableTime; i>0; i=i-1)
final int sec = i;
SwingUtilities.invokeLater(new Runnable()
public void run()
String lbl = "<html>";
lbl += "</html>";
timeLeftLabel.setText(lbl);
);
try Thread.sleep(1000); catch (InterruptedException e)
parameterFromClientsListener = clientsListener.getValue(userName,parameterToGet);
if (!parameterFromClientsListener.equals("null"))
output = parameterFromClientsListener;
game.log.fine(userName + " set (by button) " + parameterToGet + " to be equal to " + output + " . [IMPORTANT]");
return output;
game.log.fine("The partner selection phase is expired.");
// This code is executed if the Submit button was not pressed and the time run out.
if (parameterToGet.equals("partner"))
tellMyChoice(parameterToGet, this.partnerFromForm, "timer of" + field);
output = this.partnerFromForm;
game.log.fine(parameterToGet + " was submitted by timer (not by OK button).");
else
output = parameterFromClientsListener;
game.log.fine(userName + " set (by timer)" + parameterToGet + " to be equal to " + output + " . [IMPORTANT]");
return output;
我运行此代码两次。在每种情况下,我都会生成一个日志文件。在两个日志文件中,我都看到了“set (by button)”语句(直接在return
之前)。但问题是在第二个日志文件中我确实看到了“timer of”语句。如果达到“设置(按按钮)”,则不应达到。怎么会这样?我需要提一下,“设置(按按钮)”和“计时器”不会出现在我的代码中的其他任何地方(它们只出现一次)。
添加 3 个
从代码中可以看出,我没有 finally
语句。
【问题讨论】:
听起来您的方法实际上并没有在该条件下执行return 1
,而是在其他地方。你能把方法贴出来让大家看看吗?
其余代码中是否有finally
块?否则它应该只是将控制权返回给调用者。
@Roman,您有超过90
的问题没有一个可接受的答案。或许你可以回顾一下你已经给出的一些答案,看看它们是否可以被接受。
@Thilo,这个价格对新手来说是不错的。然而,对这个论坛更有经验的人应该能够提出可能有可接受答案的问题,并且当答案需要改进时,跟进他们。得到一两个没有答案的问题是不走运的,但是没有可接受的答案的 90 个问题表明你可以从中学到一些东西。顺便说一句:你可以回答你自己的问题,这样当人们搜索相同的东西时,他们可以从你所知道的东西中学习。它不一定是一种方式。 ;)
@Roman,您似乎正在轮询某个事件的发生。我可以建议使用观察者模式以便在事件发生时得到通知吗?这会让这个方法简单很多。
【参考方案1】:
这不是真的,return 语句将停止任何后面的代码。 (唯一的例外是 return 语句位于 try 块中,之后有一个 finally 块。
if(0==0)
return;
System.out.println("This will not print.");
【讨论】:
实际上这段代码不会在 Java 中编译,所以从技术上讲它不会像你说的那样运行。【参考方案2】:Return 确实结束了方法的执行。检查您的其他假设。也许代码的其他部分的某些东西没有像你假设的那样工作。
【讨论】:
【参考方案3】:return
确实结束了方法的执行。有一个例外:finally 块。在以下情况下,将返回 2
public int foo()
try
return 1;
finally
return 2;
【讨论】:
不过,不要在现实生活中这样做。在 finally 块中更改返回值是不好的形式。【参考方案4】:return 是否会停止代码的执行
嗯,差不多。
一旦遇到返回,方法执行就会停止,并且控制权将传递给调用方法,在执行完任何 finally 子句之后。
int add(int a, int b)
try
if(a == 0)
return b;
if(b == 0)
return a;
return a+b;
finally
System.out.println("Finally");
在上面的代码中,如果函数被调用为add(0, 1),“Finally”仍然会被打印出来。
如何强制方法停止?
或者从方法中退出的其他方法是什么?
Exceptions
【讨论】:
【参考方案5】:你写
if (!parameterFromClientsListener.equals("null"))
output = parameterFromClientsListener;
game.log.fine(userName + " set (by button) " + parameterToGet + " to be equal to " + output + " . [IMPORTANT]");
return output;
您正在将字符串(或其他)与字符串"null"
进行比较,如果它们不同则返回。你真的想这样做,而不是parameterFromClientsListener != null
?
(虽然这应该没什么大的区别,只要parameterFromClientsListener
既不是null
也不是"null"
,如果是null
,你的版本就会给出NullPointerException。)
你真的在你的日志文件中得到了这个条目吗?如果是这样,你也应该得到回报。
【讨论】:
【参考方案6】:我想了解观察到的行为是如何可能的。更详细地说,我看到了一种“自相矛盾”的行为。在我的日志文件中,我看到了发生在return
之前的行的输出以及返回之后代码产生的输出。所以,我假设return
不会停止程序的执行。正如其他“回答者”在这里正确提到的那样,这种假设是错误的。对行为的解释是微不足道的。我的程序多次运行显示的代码。第一次到达return
语句,第二次通过它(因为return
在if
语句中)。所以,这就是 IO 在日志文件中同时包含这两个语句的原因。
【讨论】:
以上是关于“返回”会停止方法的执行吗?的主要内容,如果未能解决你的问题,请参考以下文章
Java - 若try中有return语句,finally会执行吗?在return之前还是之后呢?