Java如何知道void方法何时完成其方法体?

7

假设我有一些代码:

public int doSomething(int x)
{
    otherMethod(x);
    System.out.println("otherMethod is complete.");
    return 0;
}

public void otherMethod(int y)
{
    //method body
}

由于 otherMethod 的返回类型为 void,那么 doSomething 方法如何知道什么时候 otherMethod 已经完成,以便继续执行下一行并打印“otherMethod 已完成”?

编辑:向 doSomething 方法添加 return 0;,以便示例代码可以编译。


1
因为方法中的代码在与调用代码相同的线程中运行,所以它会阻塞线程直到完成。 - Hovercraft Full Of Eels
它知道是因为该方法返回。 - Hot Licks
1
Java是一种基于命令的语言,运行在基于命令的虚拟机上。这意味着操作按照指定的顺序完成(或看起来是这样)。 - Hot Licks
2
如果你去做饭,发现需要番茄酱,于是去商店买,那么在回来之前如何知道不要开始使用番茄酱呢?(只有一个“你”,而且一次只能在一个地方。) - Hot Licks
没有并发处理,直到前一个方法/语句完成后,才能运行下一个方法/语句。返回类型为void的方法在结尾处或使用return;时结束。 - Peter Lawrey
2个回答

14

解析器知道执行的结束位置,甚至会添加return语句,例如:

 public static void main(String args[])  {

}

编译为:

 public static main([Ljava/lang/String;)V
   L0
    LINENUMBER 34 L0
    RETURN <------ SEE?
   L1
    LOCALVARIABLE args [Ljava/lang/String; L0 L1 0
    MAXSTACK = 0
    MAXLOCALS = 1
}

对于您的代码也是如此(尽管我添加了return 0,因为您的代码无法编译):

 public int doSomething(int x)
    {
        otherMethod(x);
        System.out.println("otherMethod is complete.");
        return 0;
    }

    public void otherMethod(int y)
    {
        //method body
    }

编译后的代码:

public doSomething(I)I
   L0
    LINENUMBER 38 L0
    ALOAD 0
    ILOAD 1
    INVOKEVIRTUAL TestRunner.otherMethod (I)V
   L1
    LINENUMBER 39 L1
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    LDC "otherMethod is complete."
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
   L2
    LINENUMBER 40 L2
    ICONST_0
    IRETURN
   L3
    LOCALVARIABLE this LTestRunner; L0 L3 0
    LOCALVARIABLE x I L0 L3 1
    MAXSTACK = 2
    MAXLOCALS = 2

  // access flags 0x1
  public otherMethod(I)V
   L0
    LINENUMBER 46 L0
    RETURN <-- return inserted!
   L1
    LOCALVARIABLE this LTestRunner; L0 L1 0
    LOCALVARIABLE y I L0 L1 1
    MAXSTACK = 0
    MAXLOCALS = 2
}

那么如果解析器在无返回值方法中没有找到return语句,它会自动将其添加到方法体的末尾? - reesjones
@CSStudent 我对编译器或JVM规范之类的东西并不是专家,但看起来是这样。 - LuxuryMode

1
由于有结束括号,一旦线程到达方法结尾,它将返回。此外,程序员可以通过编写return;来指定void方法何时完成。
编辑:我把问题搞混了。线程逐个方法执行,逐条语句执行,所以一旦线程完成一个方法,它将进入调用方法中的下一行。

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