Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Il
linguaggio
Java
Denito
dalla
Sun
Microsystems
(ora
Oracle)
nel
1995/96
Useremo
la
Standard
EdiBon
(versione
7)
SenBrete
parlare
anche
di
jdk
e
di
jre
CaraTerisBche
Object-oriented
(OO)
Distribuito
RMI
e
altri
strumenB
di
distribuzione
Sicuro
Esecuzione
in
una
"sandbox"
che
garanBsce
che
non
si
possa
danneggiare
l'host
Sorpresa!
Non
esistono
i
"tradizionali"
conce]
di
"programma"
"soToprogramma"
(funzione
o
procedura)
Il
costruTo
class
Una
classe
pu
essere
vista
come
un
Bpo
denito
dallutente
che
specica
le
operazioni
uBlizzabili
sul
Bpo
stesso
Il
Bpo
pu
essere
usato
per
dichiarare
altre
variabili
int
a,
b;
Data d;
Ogge]
Tu]
gli
ogge]
della
stessa
classe
hanno
la
stessa
struTura
Il
numero
e
Bpo
dei
loro
aTribuB
lo
stesso
Ad
esempio,
la
classe
Data
denisce
tuTe
le
date
possibili,
tramite
gli
aTribuB
giorno,
mese,
anno
CambiamenB
di
stato
Lo
stato
degli
ogge]
(mutabili)
pu
cambiare
nel
tempo,
chiamando
metodi
opportuni
data1
data1
Data
Data
giorno
=
30
mese
=
12
anno
=
2010
data1.giornoDopo()
giorno
=
31
mese
=
12
anno
=
2010
metodo giornoDopo()
Private
e
public
ATraverso
i
metodi
"public"
di
una
classe
possibile
vedere
qual
lo
stato
di
un
oggeTo
...
Data d;
int x;
x = d.leggiGiorno();
Programmazione
"in
the
small"
Altri
Bpi:
boolean:
true,
false
char:
16
bit,
caraTere
Unicode
Dichiarazione
byte
unByte;
int
a,
b=3,
c;
char
c=h,
car;
boolean
trovato=false;
Le variabili
xxx
3
11
2010
giorno
mese
anno
Dichiarazione
e
inizializzazione
La
dichiarazione
di
una
variabile
di
Bpo
riferimento
non
alloca
spazio
per
un
oggeTo,
ma
solo
per
il
riferimento
ad
un
oggeTo
A
una
variabile
di
Bpo
riferimento
assegnato
inizialmente
il
riferimento
null,
per
indicare
che
la
variabile
non
ancora
associata
ad
alcun
oggeTo
Data
d;
New
La
costruzione
di
un
oggeTo
si
realizza
dinamicamente
tramite
loperatore
new
Esempio:
Data
d
=
new
Data();
EeTo di new:
Dichiarazione
e
creazione
Data
data;
data
=
new
Data(
);
data
=
new
Data(
);
data
Data
Data
Esempio
di
costruTore
public Data(int g, int m, int a){
giorno = g;
mese = m;
anno =a;
}
Inizializzazione
e
accesso
public class Persona {
private String nome;
private Persona padre;
private int eta;
public Persona(String n) {
nome = n; padre = null; eta = 0;}
public void setPadre(Persona p) {
padre = p; }
public void setEta(int e) { eta = e; }
}
public class Esempio {
public static void main(String[] args) {
Persona paolo, pietro;
int i = 20;
paolo = new Persona("Paolo");
paolo.setEta(i);
i = 30; // quanto vale paolo.eta?
pietro = new Persona("Pietro");
pietro.setEta(i);
paolo.setPadre(pietro);
// quanto vale paolo.padre.eta?
pietro.setEta(i+1);
// quanto vale paolo.padre.eta ?
}
}
Persona
String
nome
Persona
padre
int
eta
setEta
setPadre
paolo
pietro
i
30
20
Persona
Persona
nome = Paolo
nome =Pietro
padre
=
setEta
setPadre
padre
=
eta
=
020
setEta
setPadre
30
eta
=
031
CostruTori
di
default
Se
non
si
denisce
nessun
costruTore,
il
compilatore
fornisce
il
costruTore
di
default
(senza
parametri),
che
svolge
le
seguenB
funzioni:
Alloca
lo
spazio
per
gli
aTribuB
di
Bpo
primiBvo
Alloca
lo
spazio
per
i
riferimenB
agli
aTribuB
di
Bpo
denito
dallutente
Inizializza
a
null
tu]
i
riferimenB,
a
0
tuTe
le
variabili
numeriche,
a
false
tu]
i
boolean
I
costruTori:
esempio
public class C {
private int i1;
private int i2;
}
public class Esempio {
public static void main(String args[]) { CorreTo
perch
il
compilatore
ha
inserito
automaBcamente
il
C x = new C();
costruTore
di
default
x = new C(5,7);
}
}
Sbagliato,
non
esiste
nessun
costruTore
che
prenda
due
parametri
MolB costruTori
public class C {
private int i1;
private int i2;
public C(int a1, int a2) {
i1 = a1; i2 = a2;}
public C(int a) {
i1 = a; i2 = a;}
}
z
y
x = new C();
y = new C(1);
C
i1
=
1
i2
=
1
C
i1
=
1
i2
=
4
z = new C(1,4);
CorreTo,
esiste
un
costruTore
che
prende
due
parametri
interi
Creazione
e
distruzione
Se
limplementazione
deve
essere
private,
lunico
modo
per
inizializzare
un
oggeTo
specicare
uno
o
pi
metodi
parBcolari,
chiamaB
costruTori
La
creazione
di
un
oggeTo
comporta
sempre
linvocazione
di
un
costruTore
Condivisione
(sharing)
Un
oggeTo
condiviso
tra
due
variabili
se
entrambe
accedono
a
esso
L'assegnamento
di
variabili
di
Bpo
riferimento
genera
condivisione
Se
ogge]
condivisi
sono
modicabili,
le
modiche
apportate
aTraverso
una
variabile
sono
visibili
anche
aTraverso
l'altra
public
1
1
2010
Tipi
array
Dato
un
Bpo
T
(predenito
o
denito
dallutente)
un
array
di
T
denito
come
T[]
Esempi
int[] float[] Persona[]
Dichiarazione
e
inizializzazione
Dichiarazione
int[] ai1, ai2;
float[] af1;
double ad[];
Persona[][] ap;
Inizializzazione
int[] ai={1,2,3};
double[][] ad={{1.2, 2.5}, {1.0, 1.5}};
Person[
]
person;
person
=
new
Person[20];
person[0]
=
new
Person(
);
person
person
0
16 17 18 19
person
0
Person
16 17 18 19
equivalente
a
scrivere
for (int i = 0; i < C.size(); i++) {
T x = C.get(i);
// esegui azioni su x
}
Programmazione
in
the
large
Automobile
public class Automobile {
private String colore, marca, modello;
private int cilindrata, numPorte;
private boolean accesa;
public void accendi(){
accesa=true;
}
public boolean puoPartire(){
return accesa;
}
public void dipingi(String col){
colore=col;
}
public void trasforma(String ma, String mo){
marca=ma;
modello=mo;
}
}
Chiamata
di
metodi
Vengono
valutaB
i
parametri
aTuali
Viene
creato
il
record
di
a]vazione
sullo
stack
spazio
per
i
parametri
formali
spazio
per
le
variabili
locali
Un
altro
esempio
public class Data {
private int giorno;
private int mese;
private int anno;
public void giornoDopo(){
this.giorno++;
if (this.giorno > 31){
this.giorno = 1;
this.mese++;
}
}
public static void main(String[] args){
Data d1, d2; //d1 e d2 inizializzate qui
d1.giornoDopo(); //In giornoDopo this e lo stesso riferimento di d1
d2.giornoDopo(); //In giornoDopo this e lo stesso riferimento di d2
}
}
ATribuB
costanB
possibile
denire
aTribuB
costanB
tramite
la
notazione:
nal
<denizione
di
aTributo>=<valore>
Overloading
di
metodi
Allinterno
di
una
stessa
classe
possono
esservi
pi
metodi
con
lo
stesso
nome
purch
si
disBnguano
per
numero
e/o
Bpo
dei
parametri
ATenzione:
Il
Bpo
del
valore
resBtuito
non
basta
a
disBnguere
due
metodi
Esempio
public class Prova {
public int max(int a, int b, int c) {...}
public double max(double a, double b) {...}
public int max(int a, int b) {...}
}
Ulteriore
esempio
public class Automobile {
private String colore, marca, modello;
private int cilindrata, numPorte;
private boolean accesa;
public Automobile(String col, String mar, String mod) {
colore=col;
marca=mar;
modello =mod;
}
public Automobile() {
// se serve e necessario definirlo anche se e come quello di
// default, perche ce un altro costruttore
colore=marca=modello=null;
cilindrata=numPorte=0;
}
public void accendi() {accesa=true;}
public boolean puoPartire() {return accesa;}
public void dipingi(String col) {colore=col;}
}
Reference
e
operatore
==
Loperatore
di
confronto
==
confronta
i
valori
dei
riferimenB
e
non
gli
ogge]!
d1
giorno
12
mese
2001
anno
giorno
12
mese
2001
anno
xxx
d2
yyy
Confronto
di
uguaglianza
Metodo
equals(
)
consente
di
vericare
se
due
ogge]
sono
uguali
(nel
senso
che
hanno
lo
stesso
valore
dello
stato)
per
String:
contengono
la
stessa
sequenza
di
caraTeri
Uso
String stringa1 = "Luciano;
String stringa2 = "Giovanni;
Stringa1.equals(stringa2); //false
String b = new String("Ciao");
String c = new String("Ciao");
if (b.equals(c)); //true
Enumerazioni
Si possono dichiarare Bpi enumeraB, per modellare insiemi con cardinalit ridoTa
Enumerazioni
TuTe
le
classi
enumerate
sono
eredi
della
classe
Enum
che
ore
i
seguenB
metodi
//
resBtuisce
la
costante
enumerata
della
classe
indicata
che
ha
quel
nome
staBc
Enum
valueOf(String
name)
//
resBtuisce
il
nome
della
costante
enumerata
String
toString()
import java.util.Scanner;
public class ProvaString {
public static void main (String[] args) {
Scanner in = new Scanner(System.in);
String str = in.next();
Size siz = Enum.valueOf(Size.class, str);
System.out.println(siz.toString());
}
}
Ogni
classe
enumerata
ha
un
metodo
che
resBtuisce
un
array
contenente
tu]
i
valori
della
classe
Size[] valori = Size.values();
Altri
metodi
name()
resBtuisce
il
nome
della
costante
enumeraBva
ordinal()
resBtuisce
la
posizione
(partendo
da
0)
compareTo()
confronta
loggeTo
corrente
C
con
la
variabile
enumeraBva
passata
come
parametro
e
resBtuisce
Un
valore
negaBvo
se
C
minore
del
parametro
Zero
se
C
uguale
al
parametro
Un
valore
posiBvo
se
C
maggiore
del
parametro
Loop
generalizzato
enum Color {Red, White, Blue}
for (Color c: Color.values()) { . . . }
Esempio
Un
esempio
pi
ricco:
pianeB
del
sistema
solare,
associaB
alla
propria
massa
e
raggio;
si
pu
calcolare
il
peso
di
un
oggeTo
su
ogni
pianeta
Esempio
65
Esempi
Integer i; // qui i vale null!
i = new Integer(5); //i e un rif. a oggetto che
contiene 5
Integer x = i; // sharing: x e i stesso oggetto
int y = x.intValue(); // vecchio modo
i = y; // boxing automatico
y = i; // unboxing automatico
i = 3; // come sopra
Catene
puntate
Un
oggeTo
pu
avere
aTribuB
che
sono
ancora
ogge]
o
metodi
che
resBtuiscono
ogge]:
accesso
a
metodi
e
aTribuB
avviene
a
catena
Esempi
System.out.println();
Ereditariet
possibile
stabilire
una
relazione
soToclasse_di
()
fra
le
classi
di
un
programma
Java
relazione
dordine
parziale
(riessiva
e
transiBva)
public
class
B
extends
A
{}
Relazione
di
ereditariet
La
soToclasse
eredita
tuTa
limplementazione
(aTribuB
e
metodi)
della
superclasse
Gli
aTribuB
e
metodi
della
superclasse
sono
implicitamente
deniB
anche
nella
soToclasse
(ma
con
alcune
dierenze
che
vedremo
fra
poco)
Un
semplice
esempio
public class Automobile {
private String modello;
private boolean accesa;
public Automobile(String modello) {
this.modello=modello;
this.accesa = false;
}
public void accendi() {accesa=true;}
public boolean puoPartire() {return accesa;}
}
public class AutomobileElettrica extends Automobile {
private boolean batterieCariche;
public void ricarica() {batterieCariche=true;}
...
}
}
Gerarchia
a
pi
livelli
Figure
perimeter
area
OpenFigure
ClosedFigure
numberOfSides
Polygon
Rectangle
pixel
width
color
scale()
rotate()
draw()
Ellipse
Overriding
Una
soToclasse
pu
ridenire
limplementazione
di
un
metodo
CostruTori
I
costruTori
non
sono
ereditaB
perch
occorre
inizializzare
anche
i
nuovi
aTribuB
Per
inizializzare
gli
aTribuB
private
ereditaB,
allinterno
di
un
costruTore
possibile
richiamare
il
costruTore
della
superclasse
tramite:
super(<lista
di
par.
aTuali>)
posta
come
prima
istruzione
del
costruTore
Object
In
mancanza
di
unindicazione
dierente,
una
classe
Java
estende
la
classe
Object
La
classe
Object
fornisce
alcuni
metodi
tra
i
quali:
public
boolean
equals(Object);
public
String
toString();
public
Object
clone();
String
Le
stringhe
sono
immutabili
(non
si
possono
aggiungere
o
togliere
caraTeri
a
una
stringa,
ma
occorre
costruirne
una
nuova)
CostruTori:
String()
String(String
s)
Operatore
di
concatenamento
+
Metodi
pubblici:
Esempio
public class ProvaString {
public static void main (String[] args) {
String a = new String(); //a e una ref a stringa vuota
String b = new String("Ciao"); //b e una ref a Ciao:
//abbreviazione: String b = Ciao;
String c = new String(b); //Ora c e copia di b
String d = b; //d e b sono alias
System.out.println(b + " " + c + " " + d);
}
}
InformaBon Hiding
Package
Le
classi
sono
raggruppate
in
package
Un
package
raggruppa
classi
denendo
regole
di
visibilit
Package
Una
directory
che
conBene
una
o
pi
compilaBon
unit
Introduce
un
nuovo
ambito
di
visibilit
dei
nomi:
unit
con
lo
stesso
nome
possono
stare
in
package
diversi
CompilaBon
unit
Un
le
che
conBene
la
dichiarazione
di
una
o
pi
classi
(o
interfacce)
Una
sola
dichiarata
pubblica
(public
class)
e
avente
lo
stesso
nome
del
le
"friendly
sono
visibili
solo
allinterno
dello
stesso
package/
compilaBon
unit
possono
stare
in
un
le
con
altre
classi
Esempio
package
myTools.text;
public
class
TextComponent
{
.
.
.Zzz
z;
}
package
myTools.text;
public
class
yyy
{
.
.
.
}
class
Zzz{
.
.
.
}
package
myFigs.planar;
public
class
DrawableElement
{
.
.
.
}
class
xxx
{
.
.
.
}
compilaBon units
private
protected
friendly
sono
visibili
alle
classi
nello
stesso
package
sono
visibili
solo
alle
soToclassi
nello
stesso
package
InformaBon
hiding
Una
propriet
public
una
promessa
agli
uBlizzatori
della
classe:
InformaBon
hiding
fortemente
consigliato
che
gli
aTribuB
di
una
classe
public
siano
private
o
friendly
Usare
metodi
per
accedervi!
Polimorfismo
Ereditariet
Esempio
public class UsaAutomobile {
public static void partenza(Automobile p) {
if (p.puoPartire())
p.accendi();
}
public static void main(String args[]) {
Automobile myCar = new AutomobileElettrica("T");// legale!!
partenza(myCar); //funziona anche con AutomobileElettrica
}
}
Polimorsmo
L'esempio
precedente
un
caso
di
polimorsmo
Polimorsmo
la
capacit
per
un
elemento
sinta]co
di
riferirsi
a
elemenB
di
diverso
Bpo
In
Java
una
variabile
di
un
Bpo
riferimento
T
pu
riferirsi
ad
un
qualsiasi
oggeTo
il
cui
Bpo
sia
T
o
un
soToBpo
di
T
Similmente
un
parametro
formale
di
un
Bpo
riferimento
T
pu
riferirsi
a
parametri
aTuali
il
cui
Bpo
sia
T
o
un
soToBpo
di
T
Assegnamento
polimorco
A
un
oggeTo
di
Bpo
staBco
T
si
pu
sempre
assegnare
un
oggeTo
il
cui
Bpo
staBco
S
soToBpo
di
T
(ma
non
viceversa)
Questo
consente
che
il
Bpo
dinamico
possa
essere
soToBpo
di
quello
staBco
Automobile
myCar
=
new
AutomobileEleTrica();
yourCar
xxx
xxx
Ford
modello
false
accesa
El
modello
false
accesa
true
baTerieCariche
Chiamata
di
un
metodo
Automobile myCar = new AutomobileElettrica();
myCar.puoPartire(); //OK, chiama metodo di Automobile
myCar.accendi(); //OK, chiama metodo di AutomobileElettrica
myCar.ricarica(); //KO, ricarica non e metodo di Automobile
AutomobileElettrica yourCar = new AutomobileElettrica ();
yourCar.ricarica(); //OK, chiama metodo di AutomobileElettrica
Esempio
public class UsaAutomobile {
public static void partenza(Automobile a) {
a.accendi(); //funziona anche con AutomobileElettrica
}
public static void main(String args[]) {
Automobile a1 = new Automobile("Ford");
Automobile a2 = new AutomobileElettrica("T");
a1.accendi();
//a run-time chiama implementazione di Automobile
a2.accendi();
//a run-time chiama implementazione di AutomobileElettrica
partenza(a2);
// solo a run time si puo conoscere il tipo effettivo
}
}
Binding
dinamico
public static void partenza(Automobile a) {
a.accendi();
}
Overloading
e
overriding
Overriding
non
va
confuso
con
overloading
public class Punto2D{
public float distanza(Punto2D p){}
}
public class Punto3D extends Punto2D {
public float distanza(Punto3D p){}//OVERLOADING!!!
}
Esempio
public class Punto2D{public float distanza(Punto2D p){}}
public class Punto3D extends Punto2D {public float distanza(Punto3D p){}}
public void static void main(String[] args){
Punto2D p1,p2;
Punto3D p3;
p1 = new Punto2D(3,7);
p2 = new Punto3D(3,7, 4);
System.out.println(p1.distanza(p2));//metodo di Punto2D
System.out.println(p2.distanza(p1)); //Punto2D
p3 = new Punto3D(6,7, 5);
System.out.println(p2.distanza(p3)); //Punto2D
System.out.println(p3.distanza(p1)); //Punto2D
System.out.println(p1.distanza(p3)); //Punto2D
Punto3D p4 = new Punto3D(6,1, 5);
System.out.println(p3.distanza(p4)); //Punto3D
}
Annotazioni
@Deprecated
indica
un
elemento
deprecato
e
da
non
conBnuare
ad
usare
@Override
informa
il
compilatore
che
lelemento
sovrascrive
un
elemento
dichiarato
in
una
super
classe
Non
richiesta,
ma
potrebbe
aiutare
ad
evitare
errori
La
soluzione
di
Java
DisBngue
tra
una
gerarchia
di
ereditariet
(semplice)
ed
una
gerarchia
di
implementazione
(mulBpla)
introducendo
il
costruTo
interface
Interfacce
Uninterfaccia
come
una
classe
che
pu
avere
solo
aTribuB
costanB
e
i
cui
metodi
sono
tu]
pubblici
e
astra]
Sintassi:
interface
<nome>
{
<lista
di
denizione
di
aTribuB
costanB
e
metodi
privi
di
corpo>
}
Interfacce
ed
ereditariet
Una
interfaccia
pu
ereditare
da
una
o
pi
interfacce
interface
<nome>
extends
<nome1>,..,<nomen>
{
...
}
La
gerarchia
di
implementazione
Una
classe
pu
implementare
una
o
pi
interfacce,
ma
estendere
al
pi
una
classe
se
la
classe
non
astraTa
deve
fornire
unimplementazione
per
tu]
i
metodi
presenB
nelle
interfacce
che
implementa
altrimenB
la
classe
astraTa
Sintassi:
class
<nome>
extends
<nome0>
implements
<nome1>,..,<nomen>
{...}
Interfacce
Possono
avere
solo
metodi
non
implementaB
Classi
concrete
Hanno
tu]
i
metodi
implementaB
Classe
astraTa
abstract class TwoDimFigure {
public abstract double area();
public abstract double perimeter();
public abstract void printInfo();
public void setOutlineColor(Color cc) {
// code to set the color
}
public void setInsideColor(Color cc) {
// code to set the color
}
}
Interfaccia
public interface Shape {
public String baseclass="shape";
public void draw();
}
public class Circle implements Shape {
public void draw() {
System.out.println("Drawing Circle here");
}
}
public class Main {
public static void main(String[] args) {
Shape circleshape = new Circle();
circleshape.draw();
}
}
114
I
tre
principi
Incapsulamento
Gli
ogge]
nascondono
il
loro
stato
e
parte
del
loro
comportamento
Ereditariet
Ogni
soToclasse
eredit
tuTe
le
propriet
della/
delle
superclassi
Polimorsmo
Stessa
interfaccia
anche
per
Bpi
di
daB
diversi
auto
manuale
disegna()
Super classe
automaBca SoToclassi
disegna()
Conversioni
automaBche
di
Bpo
Promozioni
short
char
int
long
oat
double
byte
->
->
->
->
->
->
->
byte,
char
byte,
short
byte,
short,
char
byte,
short,
char,
int
byte,
short,
char,
int,
long
byte,
short,
char,
int,
long,
oat
char
CasBng
in
generale
possibile
forzare
esplicitamente
la
conversione
da
un
Bpo
riferimento
T
ad
un
soToBpo
T1
purch:
Il
Bpo
dinamico
dellespressione
che
converBamo
sia
un
soToBpo
di
T1
Animale a = ;
Gatto mao = ;
a = mao; //OK assegnazione polimorfica
mao = (Gatto)a; //corretto (casting) perche a e un gatto
instanceof
Per
evitare
errori
runBme
e
stabilire
qual
il
Bpo
dinamico
di
un
oggeTo
si
pu
usare
loperatore
instanceof
Object a;
int i = System.in.read();
if (i>0) a = new String();
else a = new Integer(5);
if (a instanceof String) return a.equals("abcd")
instanceof
e
equals
public class Data {
private int giorno;
private int mese;
private int anno;
public int leggiGiorno(){}
public boolean equals(Object o) {
if (!(o instanceof Data)) return false;
Data d= (Data) o;
return (giorno==d.giorno &&
mese == d.mese && anno == d.anno);
}
}
ArrayList
Gli
arrayList
sono
contenitori
estendibili
e
accorciabili
dinamicamente
Prima
di
JDK5
potevano
contenere
solo
ogge]
Object
Da
JDK5
sono
parametrici
(generici)
rispeTo
al
Bpo
degli
ogge]
contenuB
Prima
ancora
cerano
i
Vector,
analoghi
ad
ArrayList
non
generici
ArrayList
import java.util.ArrayList;
ArrayList<Person> team = new ArrayList<Person>();
team.add(new Person("Bob"));
team.add(new Person("Joe"));
team.size()
ArrayList
Per
accedere
agli
elemenB
occorre
usare
i
metodi
get
e
set
(fanno
riferimento
a
indici
che
iniziano
da
0)
team.get(1); //restituisce la Person di nome Joe
team.set(0, new Person("Mary")); //sostituisce Mary a Bob
ArrayList
add
e
remove
sono
operazioni
costose
perch
comportano
la
traslazione
di
segmenB
dellArrayList
Il
metodo
set
NON
deve
essere
usato
per
inserire
un
elemento
in
una
posizione
che
non
c
team.set(4, new Person("Jack")); // scorretto
Genericit
e
soToBpi
Alcune
cose
sembrano
andare
contro
lintuizione
List<String> ls = new ArrayList<String>();
List<Object> lo = ls; // ERRORE IN COMPILAZIONE
lo.add(new Object());
String s = ls.get(0); // ERRORE: tenta di assegnare un Object a
una String!
Qualche
considerazione
Una
lista
di
String
una
lista
di
Object?
NO!
altrimenB
tramite
una
variabile
lista
di
Object
si
potrebbe
inserire
un
Object
in
una
lista
di
String
e
quando
si
tenta
di
estrarre,
tramite
una
variabile
lista
di
String,
un
oggeTo
String,
si
verica
un
errore
In
generale,
se
Gen<T>
una
classe
generica
e
se
ClassB
soToclasse
di
ClassA
allora
Gen<ClassB>
NON
soToclasse
di
Gen<ClassA>
E
quindi
una
lista
di
Object
NON
soToclasse
di
una
lista
di
String
Come
funzionano
static <T> void fromArrayToCollection(T[] a, Collection<T> c) {
for (T o : a) {c.add(o);}
}
Esempi
I/O
formaTato
Input
Output
Esempio
public static void main(String args[]) {
Scanner in = new Scanner(System.in);
System.out.println("Come ti chiami?");
String nome = in.nextLine();
System.out.println("Quanti anni hai?");
int eta = in.nextInt();
System.out.println("Ciao "+nome+" tra un anno avrai "
+(eta+1)+" anni");
}
Situazioni
eccezionali
Un
metodo
(utente
o
di
libreria)
deve
poter
segnalare
limpossibilit
di
produrre
un
risultato
signicaBvo
o
la
propria
terminazione
scorreTa
Apertura
di
un
le
(ma
il
le
non
esiste)
Calcolo
della
radice
quadrata
di
un
numero
(ma
il
numero
negaBvo)
Soluzioni
Eccezioni
in
Java
Un'eccezione
pu
essere
caTurata
e
gesBta
aTraverso
il
costruTo
try
{<blocco>}
catch(ClasseEccezione
e)
{<codice
di
gesBone>}
try {
x = x/y;
}
catch (DivisionByZeroException e) {
// e e loggetto eccezione
// codice per gestire leccezione
// Qui e possibile usare e
}
// istruzione successiva, da eseguire se non ce stata
// eccezione o se catch e riuscito a recuperare
Pi
rami
catch
Un
ramo
catch(Ex
e)
pu
gesBre
uneccezione
di
Bpo
T
se
T
di
Bpo
Ex
o
T
un
soToBpo
di
Ex
Pi
clausole
catch
possono
seguire
lo
stesso
blocco
try
Ciascuna
caTura
leccezione
del
proprio
Bpo
main
block1
block2
call
to
proc1
proc2
block3
block4
throw
excepBon
proc1
call
to
proc2
block5
Il
ramo
nally
Un
blocco
try/catch
pu
avere
un
ramo
nally
in
aggiunta
a
uno
o
pi
rami
catch
Il
ramo
nally
comunque
eseguito
sia
che
allinterno
del
blocco
try
non
vengano
sollevate
eccezioni
sia
che
allinterno
del
ramo
try
vengano
sollevate
eccezioni
gesBte
da
un
catch
In
tal
caso
il
ramo
nally
viene
eseguito
dopo
il
ramo
catch
che
gesBsce
leccezione
Esempio
public class Prova {
public void read(String fileName) {
try{
FileInputStream f=new FileInputStream(fileName);
... // use f
} catch(IOException ex) {...}
finally {f.close();}
}
}
public
Sollevare
eccezioni
Per
sollevare
esplicitamente
un'eccezione,
si
usa
il
comando
throw,
seguito
dalloggeTo
(del
Bpo
delleccezione)
da
lanciare
al
chiamante
Informalmente
throw
Termina
lesecuzione
del
blocco
di
codice
che
lo
conBene,
generando
un'eccezione
del
Bpo
specicato
public int fact(int n) throws NegativeException {
if (n<0) throw new NegativeException();
else if (n==0 || n==1) return 1;
else return (n*fact(n-1));
}
Tipi
di
eccezioni
Eccezioni
denite
tramite
classi,
soToBpo
del
Bpo
Throwable
Esistono
due
Bpi
di
eccezioni:
Throwable
eccezioni
checked
soToBpo
di
ExcepBon
Error
Exception
eccezioni
unchecked
soToBpo
di
RunBmeExcepBon
RuntimeException (checked
exceptions)
(unchecked exceptions)
Eccezioni
checked
Devono
essere
dichiarate
dai
metodi
che
possono
sollevarle
(altrimenB
si
ha
un
errore
in
compilazione)
Quando
un
metodo
M1
invoca
un
altro
metodo
M2
che
pu
sollevare
uneccezione
di
Bpo
Ex
(checked),
una
delle
due
seguenB
aermazioni
deve
essere
vera
Linvocazione
di
M2
in
M1
avviene
internamente
ad
un
blocco
try/catch
che
gesBsce
eccezioni
di
Bpo
Ex
(quindi,
M1
gesBsce
leventuale
eccezione)
Il
Bpo
Ex
(o
un
suo
super-Bpo)
fa
parte
delle
eccezioni
dichiarate
nella
clausola
throws
del
metodo
M1
(quindi,
M1
propaga
leventuale
eccezione)
Eccezioni
unchecked
Possono
propagarsi
senza
essere
dichiarate
in
alcuna
intestazione
di
metodo
e
senza
essere
gesBte
da
nessun
blocco
try/catch
Pu
essere
meglio
includerle
comunque
in
throws,
per
renderne
esplicita
la
presenza
(ma
per
il
compilatore
irrilevante)
I
due
costruTori
richiamano
semplicemente
i
costruTori
di
ExcepBon
throw new NewKindOfException("problema!!!")
try{....}
catch(NewKindOfException ecc){
String s = ecc.toString();System.out.println(s);
}
Eccezioni
unchecked
Il
loro
uso
dovrebbe
essere
limitato
ai
casi
in
cui
Si
traTa
di
eccezioni
di
Bpo
aritmeBco/logico
C
un
modo
conveniente
e
poco
costoso
di
evitare
leccezione
Masking
Dopo
la
gesBone
delleccezione,
lesecuzione
conBnua
seguendo
il
normale
usso
del
programma
(leccezione
viene
gesBta
e
non
si
propaga
al
chiamante)
Eccezione
usata
per
vericare
una
condizione
public static boolean sorted (int[] a) {
int prev;
try {prev=a[0];} //lancia eccezione se array e vuoto
//(era meglio check diretto su a)
catch (IndexOutOfBoundsException e){return true;}
for (int i=1; i<a.length; i++) {
if (prev <= a[i]) prev=a[i];
else return false;
}
return true;
}
Consigli
uBli
Aggiungere
ai
daB
correlaB
con
leccezione
lindicazione
del
metodo
che
lha
sollevata
Nel
caso
in
cui
la
gesBone
di
uneccezione
comporB
unulteriore
eccezione
(reecBng),
conservare
le
informazioni
Sebbene
sia
possibile
scegliere
liberamente
i
nomi
delle
nuove
eccezioni
denite,
buona
convenzione
farli
terminare
con
la
parola
ExcepBon
Pu
essere
talvolta
uBle
prevedere
un
package
contenente
tuTe
le
nuove
eccezioni
denite
A
volte
invece
conviene
denire
eccezioni
come
inner
classes