Sei sulla pagina 1di 46

Sessione 3

Sintassi Java

1
Introduzione
Un sorgente Java una sequenza di linee di codice allinterno delle quali saranno presenti una serie di elementi sintattici del
linguaggio quali ad esempio: commenti, variabili, tipi, etc.

La sintassi Java prevede che ogni istruzione termini con il carattere ; (punto e virgola).

Esempio:

String s = Ciao;

Come vedremo meglio pi avanti, tutte le linee di codice in Java devono comunque far parte di una classe.
La classe deve avere lo stesso nome del file che la contiene (ad eccezione delle classi interne che vedremo pi avanti).
Ad esempio se creassimo una classe di nome Esempio in questo modo:
public class Esempio {
..
}

2
Il file allinterno del quale andremo a scrivere la classe Esempio deve chiamarsi Esempio.java altrimenti il compilatore Java ci
segnalerebbe un errore in fase di compilazione.
I commenti in un qualsiasi linguaggio di programmazione sono quelle parti del codice che vengono ignorate dal compilatore,
ovvero non vengono considerate come facenti parte del codice sorgente. Sono utili per documentare una parte del codice in modo
da rendere pi agevole la lettura e la comprensione del codice.
In Java possibile scrivere un commento su di una sola linea di codice o su pi linee:
commento su singola linea: inserire la stringa // prima del commento
Esempio:
String s = Ciao; // questo un commento su singola linea
commento su pi linee: inserire la stringa /* per aprire la sequenza di linee di commento; inserire la stringa */ per chiudere
la sequenza di linee di commento
Esempio:
String s = Ciao;
/* Adesso inizia la sequenza di linee di commento
linea 1 di commento
linea 2 di commento
Termine della sequenza di linee di commento */
String s2 = Come va?

3
Variabili
Una variabile un dato che pu assumere diversi valori (appunto variabili), definiti allinterno di un insieme di possibili valori.
Linsieme dei possibili valori che pu assumere la variabile detto tipo della variabile.
Una variabile, prima di essere utilizzata deve essere definita, ovvero bisogna scegliere il suo nome e descrivere qual il tipo di
appartenenza (oltre ad altre informazioni che vedremo tra poco); per esempio:
String s;
Qui stiamo definendo una variabile di nome s e del tipo String (stringa, ovvero sequenza di caratteri).
Una volta che stata definita, la variabile pu essere utilizzata assegnandole un valore tra quelli ammissibili per il suo tipo;
esempio:
s = Ciao;
E possibile e anche consigliabile inizializzare una variabile, assegnandole quindi un valore di partenza che potr essere
successivamente modificato, gi in fase di definizione della variabile.
Esempio:
String s = Ciao;
int x = 3;

4
Quando una variabile viene definita ma non inizializzata JDK assegna un valore di default alla variabile, che negli esempi sopra
citati 0 per la variabile di tipo int e per la variabile di tipo String null (valore nullo, usato per gli oggetti; di fatti la variabile s
di tipo String un oggetto).

Definizione di variabili
La definizione di una variabile composta da:
un nome o identificatore: una qualsiasi sequenza di caratteri alfanumerici senza spazi. Il nome non pu iniziare con un
carattere numerico e non possono essere utilizzate alcune parole chiave che sono riservate al JDK.
La convenzione Java, usata dalla maggior parte degli sviluppatori Java, prevede lutilizzo del cosiddetto camel-case
(notazione a cammello):
o il primo carattere sempre una lettera minuscola
o si predilige luso solo di lettere minuscole
o quando il nome composto da pi parole, queste si uniscono senza lasciare spazi e usando la maiuscola solo
per la prima lettera di tutte le parole successive alla prima
Alcuni esempi di nomi con la notazione camelCase:
String nome;

5
String nomeVariabile;
String nomeSecondaVariabile;
un tipo: come gi detto, il tipo rappresenta linsieme dei possibili valori che pu assumere una variabile. Esempi di tipi
sono: int, long, double, boolean, String
un ambito o scope: determina le zone di visibilit di una variabile (se globale o locale; su questo ci torneremo pi avanti)
uno specificatore di accesso che determina chi pu accedere alla variabile (se pubblica, privata, protetta; anche su questo
ci torneremo pi avanti)
Esempi:
public int variabileNumero; (dichiarata una variabile di nome variabileNumero di tipo intero e con accesso pubblico)
private String variabileStringa; (dichiarata una variable di nome variabileStringa di tipo Stringa e con accesso privato)

Parole riservate del JDK:


abstract default if private this

boolean do implements protected throw

break double import public throws

byte else instanceof return transient

6
case extends int short try

catch final interface static void

char finally long strictfp volatile

class float native super while

const for new switch

continue goto package synchronized

7
Tipi di dati
In Java esistono due tipi di dati: primitivi e riferimento/oggetto.
I tipi primitivi sono 8, e rappresentano i tipi base del linguaggio, anche se nella pratica uno sviluppatore Java si trova a lavorare
quasi esclusivamente con tipi oggetto (Java object oriented) e i tipi primitivi vengono utilizzati solo per semplici operazioni, per
esempio come contatori piuttosto che come variabili dappoggio o di confronto (il caso dei boolean, true o false).
Gli 8 tipi primitivi sono:
byte
o numero intero a 8 bit
o valore minimo -128 (-2^7)
o valore massimo 127 (2^7-1)
o valore di default: 0
o esempio: byte b = 200;
short
o numero intero a 16 bit
o valore minimo -32.768 (-2^15)
o valore Massimo 32.768 (2^15 - 1)
o valore di default: 0

8
o esempio: short s = 20.000;

int
o numero intero a 32 bit
o valore minimo 2.147.483.648 (-2^31)
o valore massimo 2.147.483.647 (2^31 - 1)
o valore di default: 0
o esempio: int i = 2.000.000;
long
o numero intero a 64 bit
o valore minimo -9,223,372,036,854,775,808 (-2^63)
o valore massimo 9,223,372,036,854,775,807 (-2^63 - 1)
o valore di default: 0L
o esempio: long l = 2.000.000.000L
float
o numero reale a virgola mobile a precisione singola di 32 bit
o valore di default: 0f

9
o esempio: float f = 123,45f
double
o numero reale a virgola mobile a doppia precisione a 64 bit
o valore di default: 0.0d
o esempio: double d = 123456789,12d
boolean
o tipo di dato che pu assumere solo i 2 valori true e false della logica booleana. Pertanto occupa un solo bit di
memoria
o valore di default: false
o esempio: boolean b = true;
char
o singolo carattere 16-bit Unicode
o esempio: char c = A;

I tipi oggetto/classe, a differenza dei tipi base primitivi, sono tipi complessi. Saranno pi chiari pi avanti nel corso quando
approfondiremo il concetto di classi ed oggetti.
Per adesso possiamo iniziare a dire che la classe un tipo di dato costituito essenzialmente da:

10
alcuni attributi, che possono essere variabili di tipo primitivo o a loro volta essere riferimenti ad altre classi. Tali attributi
vengono chiamati, membri o campi (fields) della classe
alcune funzioni, dette metodi

Esempio di classe:
public class Esempio {
int x = 0;
String s = Ciao;
public void printX()
{
System.out.println(x);
}
public void printS()
{
System.out.println(s);
}
}

11
Nellesempio abbiamo definito un tipo di classe di nome Esempio, costituito da due membri, x di tipo int e s di tipo String, e da
due metodi che effettuano la stampa a video del valore di x e di s.
A questo punto, in unaltra parte del codice potremmo definire una variabile del tipo complesso Esempio ed inizializzarla
attraverso listruzione new:
public Esempio oggettoEsempio = new Esempio();
Nellesempio linizializzazione della variabile oggettoEsempio tramite listruzione new determina la costruzione in memoria
dello spazio necessario per ospitare tale variabile e si dice che determina la sua istanziazione. La variabile oggettoEsempio, dopo
essere stata inizializzata, viene chiamata unistanza o oggetto di classe classeEsempio.
Nel paralello con i tipi di dati primitivi possiamo dire che la classe il tipo e loggetto la variabile dopo che stata inizializzata
(e quindi costruita o istanziata).

Un array una tipologia particolare di classe che rappresenta una struttura dati destinata ad ospitare un numero n di oggetti che
devono essere tutti dello stesso tipo. Il tipo pu essere primitivo o classe.

Si pu per esempio avere un array di 10 numeri interi, oppure un array di 15 stringhe, oppure un array di 20 oggetti di una
determinata classe.

In fase di definizione, o dichiarazione, dellarray viene solo stabilito il tipo di dati che larray pu contenere. Si dichiara prima il
tipo di dati che pu contenere larray, poi si inseriscono le parentesi quadre (aperta e chiusa) e poi il nome dellarray.

12
Esempi:

int [ ] numeri; (array di numeri interi)

String [ ] stringhe; (array di stringhe)

ClassEsempio [ ] arrayDiClasseEsempio; (array di oggetti di tipo ClasseEsempio)

La dichiarazione di un array pu essere fatta in modalit postfissa o prefissa a seconda se, rispettivamente, le parentesi quadre
vengono messe prima o dopo del tipo di dati dellarray.

Esempio;

int [ ] numeri; (notazione postfissa)


[ ] int numeri; (notazione prefissa)
La dimensione dellarray, ovvero quanti elementi pu contenere, viene stabilita in fase di inizializzazione dellarray e non pu
essere successivamente cambiata.

Essendo larray un oggetto la sua inizializzazione (o istanziazione) avviene tramite listruzione new.

Esempio:

int [ ] numeri = new int[10];

13
Nellesempio stiamo definendo e creando unarray che potr contenere al massimo 10 interi.

Gli elementi dellarray sono numerati partendo da 0 e vengono acceduti sia in lettura che in scrittura attraverso la notazione
numeri[indice], dove indice un numero intero compreso tra 0 ed il numero massimo di elementi che pu contenere larray.
Nellesempio precedente, avendo istanziato un array di 10 interi, lindice pu variare tra 0 e 9.

Quindi continuando lesempio precedente:

int [ ] numeri = new int[10];

numeri[0] = 1;

numeri[1] = 2;

numeri[2] = 3;

int x = numeri[1]; (x sar uguale a 2)

14
Scope (ambito o visibilit) di una variabile
La zona di codice in cui una variabile visibile (condizione necessaria affinch sia utilizzabile) prende il nome di scope.

Perch una variabile sia effettivamente utilizzabile in un determinato blocco di codice occorre che sia visibile (condizione
necessaria ma non sufficiente) e il blocco di codice abbia anche i permessi, o privilegi, per accedere alla variabile. Come vedremo
pi avanti la definizione di quali parti di codice hanno i privilegi per accedere ad una variabile viene effettuata nella dichiarazione
della variabile attraverso il qualificatore di accesso della variabile (public, private, protected).

Esempio 1 di scope

public class ProvaScope {

int numeroEsterno = 10;

public void stampaNumeri()

int numeroInterno = 5;

System.out.println(Numero esterno= + numeroEsterno);

System.out.println(Numero interno= + numeroInterno);

15
}

public void stampaNumeroEsterno()

System.out.println(Numero esterno: + numeroEsterno);

La variabile numeroEsterno utilizzabile in un qualunque metodo della classe ProvaScope, si dice che globale per la classe
ProvaScope; invece, la variabile numeroInterno locale al metodo stampaNumeri() e pertanto utilizzabile soltanto allinterno
di tale metodo (non quindi nello scope del metodo stampaNumeroEsterno()).

La possibilit di utilizzare una variabile, come vedremo pi avanti nel corso, non dipende solo dal suo scope, ma anche dal
qualificatore di accesso (public, private, proteceted) che vedremo in seguito, che determina quali parti di codice hanno i
privilegi, ovvero i permessi, per accedere a tale variabile.

16
Unulteriore osservazione da fare riguarda la possibilit di conflitti di nome su di una variabile che ne alterano lo scope.
Quando una variabile locale ed una globale hanno lo stesso nome (e sono contemporaneamente utilizzabili anche in base ai
privilegi determinati dal qualificatore di accesso), la variabile locale ha sempre priorit su quella locale.

Esempio di conflitto di nome nello scope di una variabile

public class ProvaScope {

int numero = 10;

public void stampaNumero()

int numero = 5;

System.out.println(Numero= + numero);

public void stampaNumero2()

System.out.println(Numero= + numero);

17
}

Se lanciassimo in esecuzione il metodo stampaNumero() otterrremo la stampa a video della stringa Numero= 5, perch la
variabile locale numero viene ridefinita col valore 5 ed ha priorit sulla variabile globale numero. Viceversa, se venisse invocato
il metodo stampaNumero2() loutput a video sarebbe Numero= 10, in quanto in questo metodo la variabile numero non viene
ridefinita e pertanto viene utilizzata la variabile globale numero.

18
Costanti
Per definire una costante in Java si utilizza la parola chiave final.

Per convenzione nella definizione del nome di una costante si usano solo lettere maiuscole.

Esempio:

public final String STRINGA_COSTANTE = Questa una stringa immutabile;

19
Operatori
In un qualsiasi linguaggio di programmazione gli operatori sono elementi di unistruzione che compiono unoperazione su degli
operandi e restituiscono un risultato.

Ad esempio nellistruzione z = x+y abbiamo 2 operatori:

loperatore + che effettua la somma tra gli operandi x ed y


loperatore = che assegna il risultato a z
A seconda del numero di operandi su cui agisce loperatore si possono avere operatori:

unari (o monadici) compiono l'operazione su un unico operando


binari (o diadici) compiono l'operazione su due operandi
ternari (o triadici) compiono l'operazione su tre operandi
Esempio di operatore unario:

int x = 0;

int y = x++; (adesso sia x che y valgono 1)

20
Loperatore ++ incrementa x di ununit. Pu essere un pre-incremento ++x, o un post-incremento x++. La differenza sta nel
quando viene effettuata lassegnazione ad x. Nel pre-incremento viene effettuata subito, viceversa nel post incremento viene
differita.

Esempio:

int x = 0;

System.out.println(x++); (verr stampato a video 0, perch lincremento di x avviene dopo la stampa a video)

System.out.println(x); (verr stampato 1, perch adesso x stato incrementato)

System.out.println(++x); (verr stampato 2, perch lincremento di x avviene subito e quindi prima della stampa a video)

Le stesse identiche considerazioni, ma ovviamente al viceversa, valgono per il decremento (pre o post) che avviene attraverso
loperatore --.

Come esempio di operatori binari abbiamo gi visto la somma, o lassegnazione.

21
Come esempio di operatore ternario in Java esiste un operatore che si comprender meglio quando si parler di istruzioni
condizionali (istruzioni che vengono eseguite se si verifica una condizione).

Loperatore ternario in questione ha la struttura:

operando1 (condizione)? operando2 : operando3

Va interpretato nel seguente modo: se si verifica la condizione assegna alloperando1 il valore loperando2 altrimenti assegna
alloperando1 il valore delloperando3.

Esempio:

int x = ( y > 3 ) ? 5 : 6;

Va interpretata nel seguente modo: se y maggiore di 3 assegna ad x il valore 5, altrimenti assegna ad x il valore 6.

Unulteriore classificazione degli operatori (sempre valida in tutti i linguaggi di programmazione) effettuata in base al tipo di
operazione che svolgono:

aritmetici: effettuano operazioni aritmetiche. Esempi sono i classici + - * / per le 4 operazioni aritmetiche di base, % che
restituisce il modulo (resto intero della divisione), ++ e -- (pre e post incremento e pre e post decremento di cui abbiamo parlato
prima)

22
assegnazione: assegnano valori a variabili

condizionali effettuano operazioni in base ad una condizione (come nel caso delloperatore ternario)

confronto: confrontano i valori degli operandi. Esempi sono i classici > (maggiore), >= (maggiore o uguale), < (minore), <=
(minore o uguale), == (uguale), != (diverso)

logici: compiono operazioni logiche su variabili boolean. Esempi sono && (AND), || (OR), ! (NOT). Per il significato si rimanda
allo studio della logica Booleana che non pu essere oggetto del corso Java, anche per motivi di spazio.

Esempio:

boolean a = false;

boolean b = true;

booelan c = a && b; ( c sar uguale a false)

boolean d = a || b; ( d sar uguale a true )

boolean e = !a; ( e sar uguale a true )

boolean f = !b; ( f sar uguale a false )

su bit: compiono operazioni sui singoli bit in memoria. In questo corso non ci soffermeremo sul loro utilizzo

23
di concatenamento: che concatenano dati diversi. Un classico esempio dato dalloperatore + utilizzato per concatenare le
stringhe.

Esempio:

String s = Ci + ao; ( il risultato sar s = Ciao)

di conversione: effettuano conversioni tra tipi di dati. Le conversioni tra tipi di dati sono possibili quando c compatibilit tra i
tipi. Ad esempio un int pu essere convertito a float e viceversa (salvo perdita di precisione, poich si perde la parte frazionaria)
perch sono entrambi tipi numerici, ma non possibile convertire un boolean in un float. La conversione avviene tramite
loperatore ().

Esempio:

float x = 123.45;

int y = (int) x; ( y diventer 123, perdendosi la parte frazionaria )

Inoltre possibile convertire oggetti tra di loro, si parla di casting, ma di questo parleremo pi avanti.

In Java esistono anche delle operazioni composte del tipo y+=x che si interpreta come y = y +x.

Esempio:

24
int x = 1;

int y = 2;

y +=x; ( y sar uguale a 3 )

Inoltre quando si concatena una stringa con un tipo primitivo automaticamente Java effettua una conversione del tipo primitivo in
stringa e poi concatena le due stringhe.

Esempio:

int x = 1;

String s = Ciao;

String s2 = s + x; ( s2 sar uguale a Ciao1)

25
Strutture di controllo del flusso
Tutte le istruzioni che compongono il codice sorgente vengono eseguite a run-time in ordine sequenziale, dallalto in basso e da
sinistra a destra, tranne le cosiddette istruzioni di controllo del flusso, che come suggerisce il nome consentono di modificare il
normale flusso di esecuzione del programma.

Esempio:

int x = 2;

int y = x + 3; // y uguale a 5

int z = 1;

z += y; // equivale a scrivere z = z + y, quindi z uguale a 6

Le istruzioni del frammento di codice riportato sopra portano ai risultati indicati nei commenti proprio perch eseguite in ordine
sequenziale dallalto in basso e da sinistra a destra.

Adesso anticipiamo un esempio di uso di istruzione di controllo del flusso:

int x = 2;

int y = x + 3;

26
int z = 1;

if ( y < x )

z += y;

else

z += x;

Listruzione if ( y < x ) unistruzione di salto condizionale (un tipo di istruzione di controllo del flusso), che pu modificare il
normale flusso sequenziale del codice. Listruzione stabilisce che se y minore di x listruzione successiva da eseguire z += y;,
altrimenti (else) listruzione successiva z += x;.

Nel caso desempio essendo y maggiore di x verr eseguita listruzione di codice z +=x; e pertanto avviene un salto nel flusso
sequenziale di esecuzione delle istruzioni.

Le istruzioni di controllo del flusso di esecuzione in Java, che vedremo tra poco attraverso alcuni esempi, sono:

27
istruzioni di salto condizionale: sono le istruzioni if-else, switch, case. La modifica del flusso avviene a seconda che si
verifichi o meno una determinata condizione
istruzioni iterative: for, do, while. La modifica del flusso avviene ripetendo una sequenza di istruzioni finch valida una
determinata condizione. Supponendo di avere un blocco di 10 istruzioni che vengono ripetute finch si verifica una
determinata condizione, il flusso eseguir le istruzioni del blocco dalla 1 alla 10, dopodich anzich eseguire listruzione
11, ritorner ad eseguire listruzione 1 del blocco; questo finch la condizione sar valida
istruzioni di salto incondizionato: break, continue, return. Queste istruzioni determinano il salto del codice forzato ad
una istruzione differente dalla successiva nellordine sequenziale
istruzioni di gestione delle eccezioni: try-catch-finally. Queste istruzioni verranno approfondite pi avanti nel corso. Per
ora possiamo iniziare a dire che hanno un comportamento simile alle istruzioni condizionali. Qui per la condizione che
determina il salto nel flusso di codice determinata dal verificarsi di un errore. Ovvero, se si verifica un errore (in Java
eccezione o Exception) il codice salta lordine sequenziale. Il significato di try-catch (prova e cattura) lo potremmo
riassumere cos: prova (try) ad eseguire questo blocco di istruzioni, se si verificasse uneccezione (errore), cattura (catch)
il flusso ed esegui questaltro blocco di istruzioni

Esempio di istruzione condizionale if- else if - else:

int x = 2;

28
int y = 3;

int z = 1;

if ( y < x )

z += 10; // istruzione eseguita se y minore di x (nellesempio non viene eseguita)

else if ( x == y )

z += 20; // istruzione eseguita se y uguale ad x (nellesempio non viene eseguita)

else // in tutti gli altri casi, ovvero solo se y maggiore di x

z = 100; // istruzione eseguita se y maggiore di x (nellesempio viene eseguita)

29
Vediamo un equivalente dellesempio mostrato prima ma sviluppato attraverso il costrutto switch case - default

Esempio di istruzione condizionale switch case default

int x = 2;

int y = 3;

int z = 1;

switch ( y x ) //( valuta la differenza tra y ed x )

case -1: // se y x == -1 (ovvero se y minore di x)

z = 11;

break; //esci dal blocco switch

30
case 0: // se y x == 0 (ovvero y uguale ad x)

z = 21;

break; // esci dal blocco switch

default: ( in tutti gli altri casi, quindi se y maggiore di x)

z = 100;

Esempio1 di istruzione iterativa for

for ( int i=0; i<10; i++ )

31
System.out.println(Numero: + i);

/*

verranno stampate a video 10 stringhe del tipo:

Numero 0;

Numero 1;

.;

Numero 9;

*/

Allinterno delle parentesi tonde successive alla parola chiave for abbiamo 3 elementi:

condizione di inizio: int i=0;. Ovvero il ciclo inizia con i=0


condizione di uscita dal ciclo: i<10;. Ovvero il ciclo termina appena i maggiore o uguale di 10
espressione da eseguire alla fine di ogni passo del ciclo: i++. Ovvero ad ogni passo del ciclo incrementa i di 1
Pertanto, listruzione for ( int i=0; i<10; i++ ) va interpretata come per i che va da 0 a 9, incrementandosi di ununit, esegui il
blocco di codice seguente.

32
Conseguentemente, come indicato nel commento multi-linea (stringhe comprese tra /* e */), verr eseguita la stampa a video
della stringa Numero 0, fino a Numero 9.

Da notare che lincremento della variabile i tramite listruzione i++ interna alle parentesi tonde del ciclo for viene eseguita come
ultima istruzione del ciclo, quindi dopo listruzione di stampa a video System.out.println. E per questo che le stringhe stampate a
video partono da Numero 0; se fosse stata incrementata prima la variabile i e poi effettuata la stampa a video, le stampe
sarebbero partite da Numero 1.

Da notare anche allinterno dellistruzione di stampa a video, la conversione da numero a stringa dellintero i e la successiva
concatenazione tramite loperatore + delle stringhe Numero e i (prima valutato come numero e poi convertito a stringa).

Esempio 2 di istruzione iterativa for

for ( int i=7; i<10; i++ )

System.out.println(Numero: + i);

/*

verranno stampate a video 3 stringhe:

33
Numero 7;

Numero 8;

Numero 9;

*/

In questutlimo esempio abbiamo cambiato la condizione di inizio, che adesso i=7.

Pertanto il ciclo verr eseguito 3 volte per i=7, i=8 e i=9.

Esempio 3 di istruzione iterativa for

for ( int i=0; i<2; i++ )

System.out.println(Numero: + i);

/*

verranno stampate a video 2 stringhe:

34
Numero 0;

Numero 1;

*/

In questultimo esempio abbiamo cambiato la condizione di uscita dal ciclo che adesso i<2. Pertanto il ciclo verr eseguito solo
2 volte, per i=0 e i=1.

Esempio 4 di istruzione iterativa for

for ( int i=0; i<10; i=i+2 )

System.out.println(Numero: + i);

/*

verranno stampate a video 5 stringhe:

Numero 0;

35
Numero 2;

Numero 4;

Numero 6;

Numero 8;

*/

In questultimo esempio abbiamo cambiato listruzione da eseguire ad ogni passo del ciclo, adesso i=i+2. Ovvero stiamo
dicendo che ad ogni passo del ciclo i si deve incrementare non pi di ununit bens di 2 unit.

Vediamo adesso un esempio di istruzione iterativa while equivalente al primo esempio svolto tramite istruzione iterativa for.

36
Esempio 1 di istruzione iterativa while

int i = 0;

while ( i < 10 )

System.out.println(Numero + i);

i++;

Vediamo adesso un esempio un po pi complesso che utilizza sia il costrutto while che il costrutto if e loperatore logico !
(equivalente al NOT booleano o anche alla condizione false)

Esempio 2 di istruzione iterativa while

int i = 0;

boolean exit = false;

while ( !exit )

37
{

If ( i >= 2 )

exit = true;

else

System.out.println(Numero + i);

i++;

In questultimo esempio la condizione di uscita dal ciclo while data dallespressione !exit che equivale a NOT exit oppure a
exit == false. Quindi, la condizione di uscita si verifica appena la variabile exit, che stata inizializzata a true, diventa false.

exit diventer false quando la variabile i, inizializzata a 0, diventer maggiore o uguale di 2.

38
Pertanto il codice stamper a video le 2 stringhe Numero 0 e Numero 1, dopodich la variabile i diventar uguale a 2 e quindi
la condizione dellif imposter la variabile exit a false e far di conseguenza terminare il ciclo while.

Listruzione iterativa do while pressoch identica allistruzione while ad eccezione del fatto che nel ciclo do while la
valutazione della condizione di permanenza del ciclo viene effettuata alla fine, dopo il blocco di istruzioni del ciclo. Pertanto, nel
ciclo do while, il ciclo viene sempre eseguito almeno una volta (la prima).

Esempio 1 di istruzione iterativa do while

int i = 0;

do

System.out.println(Numero + i);

i++;

} while ( i < 10 );

Lesempio appena proposto equivalente al primo esempio mostrato sia per literazione for che per literazione while e produce
quindi la stampa di 10 stringhe del tipo Numero 1.Numero 9.

39
Esempio 2 di istruzione iterativa do while

int i = 11;

do

System.out.println(Numero + i);

i++;

} while ( i < 10 );

Questultimo esempio mostra come listruzione do while determina sempre lesecuzione del blocco di codice successivo
allistruzione do, almeno la prima volta. Infatti nellesempio la variabile i inizializzata ad 11, ma la condizione di uscita ( i < 10
) valutata dopo lesecuzione del blocco di codice successivo allistruzione do.

40
Vediamo adesso degli esempi di istruzioni di salto incondizionato break e continue.

Listruzione break determina linterruzione delliterazione e manda in esecuzione la prima istruzione successiva al blocco di
codice iterativo.
Esempio di istruzione di salto incondizionato break

for ( int i=0; i<10; i++ )

System.out.println(Una prima stringa, al passo + i);

if ( i == 1 )

break;

System.out.println(Una seconda stringa al passo + i);

System.out.println(Finito il ciclo);

41
Il codice riportato sopra mandato in esecuzione stamperebbe a video:

Una prima stringa al passo 0

Una seconda stringa al passo 0

Una prima stringa al passo 1

Finito il ciclo

Ovvero, quando la variabile i diventa uguale a 1 il ciclo viene interrotto e non viene pi eseguita alcuna istruzione del ciclo.
Notare che la stringa Una seconda stringa al passo 1 non venga stampata, perch successiva allistruzione break.

Listruzione continue ha leffetto di saltare le successive istruzioni del blocco iterativo e riportare lesecuzione del codice al
successivo passo di iterazione. Quindi, la differenza rispetto allistruzione break, risiede nel fatto che mentre questultima
determina larresto di tutto il ciclo iterativo, listruzione continue determina linterruzione solo delliterazione correntemente in

42
esecuzione nel ciclo. La continue pu essere interpretata come continua literazione andando direttamente al successivo passo
del ciclo.

Esempio di istruzione di salto incondizionato continue

for ( int i=0; i<3; i++ )

if ( i == 1 )
{
continue;
}

43
System.out.println(Stampa + i);

System.out.println(Ciclo finito);

Mandando in esecuzione il precedente codice sorgente loutput sarebbe questo:

Stampa 0

Stampa 2

Ciclo finito

A causa dellistruzione continue, eseguita soltanto al secondo passo di iterazione (i=1), viene saltata la stampa a video di
Stampa 1, e si passa al terzo passo di iterazione (i=2) che produce la stampa a video Stampa 2. Se al posto della continue
avessimo scritto listruzione break, il ciclo sarebbe finito del tutto al passo 1 e a video avremmo visto soltanto la stampata
Stampa 1.

Le istruzioni di controllo del flusso tramite gestione delle eccezioni, come detto, verranno trattate in modo pi approfondito
pi avanti nel corso.

44
Per adesso possiamo comunque introdurre il concetto attraverso un esempio.

Esempio di gestione delle eccezioni

int x = 25;

int y = 0;

try

System.out.println(X = + x);

System.out.println(Y = + y);

int z = x / y; // questa istruzione lancia uneccezione (errore) di tipo matematico

System.out.println(Z = + z);

catch ( Exception ex )

ex.printStackTrace();

45
}

Per adesso, quello che importante capire la logica del codice appena mostrato. Le prime due stampe a video (con i valori di x e
di y) vengono effettuate. Poi si verifica un errore nel codice (divisione per zero) e quindi la successiva istruzione (stampa a video
di z) non viene effettuata, come si dice in gergo Java viene rilanciata uneccezione e il flusso di esecuzione passa al blocco
catch, che cattura leccezione e stampa a video il messaggio di errore attraverso il metodo (o funzione) printStackTrace().

46