Soluzione Esercizio 2 dell'Esercitazione #3

Esercizio 2

Obiettivo: Familiarizzare con la sequenza delle istruzioni.

Attività:

  1. Considerate il programma seguente
    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.
  2. Considerate il programma precedente, nella sua versione corretta. Che cosa visualizza? Che cosa visualizza se si inverte l'ordine delle ultime due istruzioni di assegnamento? Ossia:
    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é?

Soluzione

  1. I primi 4 errori sono: Compilando il programma otteniamo:
    >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: Correggiamo anche questi e ora la compilazione va a buon fine (se il compilatore non dà messaggi, vuol dire che non ha trovato errori):
    >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 è: Correggendo anche questo, salvando, ricompilando e rieseguendo otteniamo:
    >javac Prova.java
    
    >java Prova
    x = 1
    y = 2
    z = 3
    
    senza più errori.
  2. Come abbiamo appena visto, il programma
    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 = 3
    
    Invertendo 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 = 3
    
    Per 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
    

Fate l'amore e non la guerra! Valid HTML 4.01! Valid CSS! Stefano Mizzaro
Last modified: 2003-06-12