View Full Version : [Java] return nel main
Antares88
04-09-2008, 11:55
Stavo vedendo il listato di un esercizio e ho trovato un'istruzione return alla fine del metodo main.
Come mai ? il main ha tipo di ritorno void, a che scopo metterci un return alla fine ? tra l'altro la classe compila, non ci sono errori, e in esecuzione funziona.
Mi spiegate questa cosa ? Che senso ha metterci un return quando è ovvio che completata l'esecuzione del main il controllo torna alla JVM ?
agente mm8
04-09-2008, 12:18
Beh, nn saprei, può essere che il prog viene chiamato da un altro prog e quindi deve il prog chiamante usa la varibile ritornata dal main.
Per curiosità, nn puoi mandarmi il source code?
non ha molto senso se il valore di ritorno è void, comunque il linguaggio permette di inserirlo.
significa che quando arriva a quella istruzione esce dal metodo main (anche se c'è altro codice dopo che quindi non verrà mai raggiunto)
Ziosilvio
04-09-2008, 13:07
Stavo vedendo il listato di un esercizio e ho trovato un'istruzione return alla fine del metodo main.
Come mai ? il main ha tipo di ritorno void, a che scopo metterci un return alla fine ?
Vuol dire che, se si arriva a quel punto, non è necessario fare altro, e il programma può terminare.
Ossia, invece di:
public static void main(String[] args) {
// blah blah blah
if (condizione) {
// lavoro 1
} else {
// lavoro 2
}
} // fine di main
si può usare:
public static void main(String[] args) {
// blah blah blah
if (condizione) {
// lavoro 1
return;
}
// lavoro 2
} // fine di main
Antares88
04-09-2008, 14:59
Questo è il frammento di codice(la classe non è definita).
public static int B(int pb) {
/* b0 */ System.out.println("In B. Parametro pb = " + pb);
/* b1 */ return pb+1;
}
public static int A(int pa) {
/* a0 */ System.out.println("In A. Parametro pa = " + pa);
/* a1 */ System.out.println("Chiamata di B(" + (pa * 2) + ").");
/* a2 */ int va = B(pa * 2);
/* a3 */ System.out.println("Di nuovo in A. va = " + va);
/* a4 */ return va + pa;
}
public static void main(String[] args) {
/* m0 */ System.out.println("In main.");
/* m1 */ int vm = 22;
/* m2 */ System.out.println("Chiamata di A(" + vm + ").");
/* m3 */ vm = A(vm);
/* m4 */ System.out.println("Di nuovo in main. vm = " + vm);
/* m5 */ return;
}
Perché mettere un return li quando anche senza di esso il main terminerebbe e restituirebbe il controllo ? non c'è altro codice dopo e il return non fa parte di un controllo condizionale.
@Ziosilvio: è giusto il secondo codice che hai postato ? forse non ho capito bene ma non mi torna.
wizard1993
04-09-2008, 15:01
il return in un metodo funziona come un break in un ciclo
Questo è il frammento di codice(la classe non è definita).
public static int B(int pb) {
/* b0 */ System.out.println("In B. Parametro pb = " + pb);
/* b1 */ return pb+1;
}
public static int A(int pa) {
/* a0 */ System.out.println("In A. Parametro pa = " + pa);
/* a1 */ System.out.println("Chiamata di B(" + (pa * 2) + ").");
/* a2 */ int va = B(pa * 2);
/* a3 */ System.out.println("Di nuovo in A. va = " + va);
/* a4 */ return va + pa;
}
public static void main(String[] args) {
/* m0 */ System.out.println("In main.");
/* m1 */ int vm = 22;
/* m2 */ System.out.println("Chiamata di A(" + vm + ").");
/* m3 */ vm = A(vm);
/* m4 */ System.out.println("Di nuovo in main. vm = " + vm);
/* m5 */ return;
}
Perché mettere un return li quando anche senza di esso il main terminerebbe e restituirebbe il controllo ? non c'è altro codice dopo e il return non fa parte di un controllo condizionale.
@Ziosilvio: è giusto il secondo codice che hai postato ? forse non ho capito bene ma non mi torna.
non c'è un motivo, non serve a niente in questo caso.
ciò non toglie che si può scrivere.. giusto? :fagiano:
wingman87
04-09-2008, 15:43
Penso che sia ridondante, nel senso che il return alla fine di un metodo void è implicito
DanieleC88
04-09-2008, 15:49
Magari è stato inserito solo per l'abitudine di vedere un return al termine della funzione.
Anche in C e in C++ è perfettamente lecito dire:
void esempio()
{
return;
}
anche se non serve a nulla. :)
ciao ;)
concordo, è semplicemente ridondante. non è la peggiore delle idiozie che capita di vedere quando si legge del codice altrui.
@Antaz: si, il secondo codice di Ziosilvio contiene un errore; il "lavoro 2" doveva stare dopo la penultima parentesi graffa.
yggdrasil
04-09-2008, 18:09
vorrei però far notare che anche in java, come in tutti gli altri programmi, il sistema operativo può ricevere un valore intero che indica se il programma è stato terminato bene o no
infatti in c è molto più corretto usare int main che void main e ritornare 0 se tutto finisce bene o un altro numero se va male ;)
ma in questo caso il tipo di ritorno era void
banryu79
05-09-2008, 08:22
vorrei però far notare che anche in java, come in tutti gli altri programmi, il sistema operativo può ricevere un valore intero che indica se il programma è stato terminato bene o no
infatti in c è molto più corretto usare int main che void main e ritornare 0 se tutto finisce bene o un altro numero se va male ;)
Sì però in questo caso, guardando il codice postato, si vede che la variabile intera "vm" istanziata nel corpo del metodo main viene usata solo come appoggio per essere usata nella chiamata System.out.println().
Inoltre per tornare un valore al sistema operativo allo scopo di indicare la corretta esecuzione dell'applicazione o un avvenuto errore, in Java di solito si usa il metodo System.exit(intArgument) [o Runtime.getRuntime.exit(intArgument)].
Ziosilvio
05-09-2008, 14:50
il secondo codice di Ziosilvio contiene un errore; il "lavoro 2" doveva stare dopo la penultima parentesi graffa.
Vero. Grazie. Ora correggo.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.