Obiettivo: Familiarizzare con la sequenza delle istruzioni.
Attività:
Class Prova { public static void Main(string[] args) { int x; int y; int z; x = 1; y = 2; y = x + 1 z = y + x; System.out.println("x = " + x + "\ny = " + y + "\nz = " + z) } }Ci sono alcuni (4 + 1) errori: cercate innanzi tutto di individuarli sulla carta, senza compilare. Poi compilate (senza correggere il programma) e analizzate i messaggi di errore del compilatore. Vedrete che gli errori vengono individuati un po' alla volta: correggete di volta in volta solo quelli individuati dal compilatore, e ricompilate finché la compilazione non dà più errori. Poi eseguite: dovrebbe essere segnalato (questa volta dall'interprete) un altro errore: correggetelo, ricompilate e rieseguite.
class Prova { public static void main(String[] args) { int x; int y; int z; x = 1; y = 2; z = y + x; y = x + 1; System.out.println("x = " + x + "\ny = " + y + "\nz = " + z); } }E che cosa succede se adesso si inverte l'ordine della seconda e terza istruzione di assegnamento? Ossia:
class Prova { public static void main(String[] args) { int x; int y; int z; x = 1; z = y + x; y = 2; y = x + 1; System.out.println("x = " + x + "\ny = " + y + "\nz = " + z); } }Perché?
Class
anziché class
(le lettere
maiuscole sono diverse dalle minuscole!!);string
anziché String
(idem);;
" (punto e virgola) mancante alla fine
dell'istruzione y = x + 1;
(tutte le
istruzioni devono terminare con un punto e virgola);;
" mancante alla fine
dell'istruzione System.out.println
.>javac Prova.java Prova.java:1: 'class' or 'interface' expected Class Prova { ^ 1 errorQuesto errore si potrebbe tradurre con:
Errore alla riga 1 del file Prova.java. Mi aspettavo 'class' o 'interface e invece ho trovato Class (indicato dal simbolo "^") Class Prova { ^Correggiamo l'errore e ricompiliamo (ricordandoci di salvare il sorgente Java!):
>javac Prova.java Prova.java:9: ';' expected y = x + 1 ^ Prova.java:11: ';' expected System.out.println("x = " + x + "\ny = " + y + "\nz = " + z) ^ Prova.java:2: cannot resolve symbol symbol : class string location: class Prova public static void Main(string[] args) { ^ 3 errorsOra il compilatore è in grado di trovare altri tre errori:
;
" mancante alla riga 9;;
" mancante alla riga 11;string
", che non riesce a
"interpretare", alla riga 2>javac Prova.java >Ora che il compilatore non segnala più errori, possiamo eseguire (prima era impossibile: se il compilatore dà errori, non genera il ".class"); proviamo:
>java Prova Exception in thread "main" java.lang.NoSuchMethodError: main >Questo messaggio è meno comprensibile dei precedenti, ma con un po' di sforzo capiamo che l'interprete (non il compilatore!) Java ci sta dicendo che non trova il metodo
main
("... NoSuchMethodError: main
"). E infatti ha ragione
lui! Il quinto errore è:
Main
anziché main
(le lettere
maiuscole sono diverse dalle minuscole e ogni programma deve avere il
"main
").>javac Prova.java >java Prova x = 1 y = 2 z = 3senza più errori.
class Prova { public static void main(String[] args) { int x; int y; int z; x = 1; y = 2; y = x + 1; z = y + x; System.out.println("x = " + x + "\ny = " + y + "\nz = " + z); } }visualizza
>javac Prova.java >java Prova x = 1 y = 2 z = 3Invertendo l'ordine delle ultime due istruzioni di assegnamento i valori visualizzati potrebbero essere diversi. Per capire che valori dobbiamo aspettarci, basta osservare che subito prima dell'esecuzione del primo dei due assegnamenti
x
vale 1
e
y
vale 2
. Se eseguiamo prima, come ci viene
chiesto, z = y + x;
, a questo punto
z
vale 3
(e x
e y
sono invariate). Eseguendo poi
y = x + 1;
, y
assume il
valore 2
. I valori visualizzati sono quindi invariati e
sono 1, 2 e 3, come si può verificare modificando il programma
class Prova { public static void main(String[] args) { int x; int y; int z; x = 1; y = 2; z = y + x; y = x + 1; System.out.println("x = " + x + "\ny = " + y + "\nz = " + z); } }ed eseguendolo (dopo aver ricompilato!):
>javac Prova.java >java Prova x = 1 y = 2 z = 3Per quanto riguarda l'ultima domanda, la situazione sembra analoga. Ma non lo è. Infatti, scambiando l'ordine di
y = 2;
e
z = y + x;
succede che, ovviamente,
viene eseguito prima z = y + x;
. Ma
nell'espressione alla destra di questo assegnamento
(y + x
) compare una variabile (y
)
che ancora non ha un valore! E infatti, il compilatore segnala un
errore:
>javac Prova.java Prova.java:8: variable y might not have been initialized z = y + x; ^ 1 error