“返回”会停止方法的执行吗?

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 语句,第二次通过它(因为returnif 语句中)。所以,这就是 IO 在日志文件中同时包含这两个语句的原因。

【讨论】:

以上是关于“返回”会停止方法的执行吗?的主要内容,如果未能解决你的问题,请参考以下文章

Java - 若try中有return语句,finally会执行吗?在return之前还是之后呢?

c++中用*this返回一个对象,会调用复制构造函数吗?

如果视频文件损坏,MPMoviePlayerViewController 会返回错误吗?

表单中的代码执行停止

如果它们跟随返回,里面的语句最终会被执行吗? [复制]

javaScript中的setTimeout返回值有啥用?