2013-03-22 14 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.

Problemi correlati