2013-03-22 7 views
7

Diciamo che ho un po 'di codice: "otherMethod è completo"Come fa Java a sapere quando un metodo void ha completato il suo corpo del metodo?

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

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

Dal tipo di ritorno di otherMethod è vuoto, come fa il metodo doSomething sapere quando otherMethod ha completato, in modo che possa passare alla successiva stampa come e ?

MODIFICA: è stato aggiunto return 0; al metodo DoSomething in modo che il codice di esempio venga compilato.

+1

Poiché il codice nel metodo viene eseguito nello stesso thread del codice chiamante e quindi blocca il thread fino al completamento. –

+0

Lo sa perché il metodo restituisce. –

+1

(Java è un linguaggio imperativo in esecuzione su una VM imperativa. Ciò significa che le operazioni vengono completate (o visualizzate) nell'ordine in cui sono specificate.) –

risposta

14

Il parser sa dove alla fine di esecuzione è e perfino aggiunge un ritorno, per esempio:

public static void main(String args[]) { 

} 

compila a:

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 
} 

E lo stesso vale per il codice (anche se' ve aggiunto nel ritorno 0 dal momento che il codice non può essere compilato):

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

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

codice compilato:

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 
} 
+0

Quindi se il parser non trova alcuna istruzione' return' nel metodo void, ne aggiunge automaticamente uno alla fine del corpo del metodo? – reesjones

+0

@CSStudent Non sono esperto del compilatore o della specifica JVM o qualcosa del genere, ma sembrerebbe così. – LuxuryMode

1

A causa della parentesi finale. Una volta che il thread arriva alla fine del metodo, ritornerà. Inoltre, il programmatore può specificare quando un metodo void è finito scrivendo return;

Modifica: ho risolto la domanda. Il Thread esegue un metodo alla volta, una dichiarazione alla volta, quindi una volta terminato il thread, un metodo andrà alla riga successiva nel metodo di chiamata.