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 error
Questo 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 errors
Ora 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
Stefano Mizzaro