7

私がいくつかのコードを持っているとしましょう:

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

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

doSomethingotherMethodの戻り型はvoidであるため、メソッドはどのようにしotherMethodて完了したかを認識し、次のlikeに進んで、「otherMethodcompleted。」と出力できます。

編集:return 0;サンプルコードがコンパイルされるようにdoSomethingメソッドに追加されました。

4

2 に答える 2

14

パーサーは、実行の終わりがどこにあるかを知っており、たとえば次のようにリターンを追加します。

 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
}

そして、同じことがあなたのコードにも当てはまります(あなたのコードはコンパイルされないので、戻り値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
}
于 2013-03-22T01:18:55.057 に答える
1

終了ブラケットのため。スレッドがメソッドの最後に到達すると、スレッドは戻ります。さらに、プログラマーは、次のように記述して、voidメソッドがいつ終了するかを指定できます。 return;

編集:私は質問を混乱させました。スレッドは一度に1つのメソッド、一度に1つのステートメントを実行するため、スレッドがメソッドを終了すると、呼び出し元のメソッドの次の行に移動します。

于 2013-03-22T01:15:56.367 に答える