Package e Gestione delle Eccezioni

Package
Corso di Linguaggi di
Programmazione ad Oggetti 1
A.A. 2003/04
A cura di
Gianmaria Mancosu
1
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 2
API – Application
Programming Interface
l
l
I vecchi linguaggi (Pascal, C, FORTRAN)
permettono di raccogliere le funzioni in librerie
Con i linguaggi OO le librerie di funzioni sono
sostituite dalle librerie di classi o toolkit
l
l
Stesse operazioni e funzionalità delle vecchie librerie
di funzioni
Vantaggio: con l’uso dell’ereditarietà il programmatore
può facilmente estendere e modificare questi
strumenti per la propria applicazione
Package & Exception
Gianmaria Mancosu
2
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 3
API – Application
Programming Interface
l
l
Spesso si definiscono dei Framework che specificano
una determinata interfaccia e si lascia liberi i fornitori
di implementarla a proprio piacimento per la propria
piattaforma
La piattaforma Java definisce una serie di API e di
Framework che sono continuamente estesi, per
esempio:
l
l
l
Swing, per l’interfaccia grafica
JDBC API, Java DataBase Connectivity API
JavaBeans, l’architettura per creare componenti
Package & Exception
Gianmaria Mancosu
3
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 4
Astrazione
l
Funzioni
l
l
Oggetti
l
l
Scrivere un algoritmo una volta ed usarlo in molte
situazioni
Raggruppare un insieme correlato di attributi e
comportamenti (behavior) in una classe
Framework e API
l
Gruppi di oggetti che forniscono un’attività complessa, che
possono essere estesi o usati così come sono
Package & Exception
Gianmaria Mancosu
4
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 5
Package
l
l
l
Aiutano la gestione di grandi progetti
software
Possono contenere classi e sotto-package
Analogia con le directory e i file
l
l
l
File çè Classe
Directory çè Package
Le classi vengono raggruppate per attinenza
l
Es. classi di I/O, classi di GUI
Package & Exception
Gianmaria Mancosu
5
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 6
Package in UML
painter
model
gui
Drawing
Figure
Square
Circle
printer
Package & Exception
Gianmaria Mancosu
6
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 7
Package Declaration
l
Per specificare l’appartenenza di una classe ad un package si
usa la keyword package
package painter.model;
l
l
l
l
l
I nomi dei package devono essere gerarchici e separati con
un punto
Solitamente si usano nomi con lettere minuscole
La dichiarazione deve essere fatta all’inizio del file sorgente
Si può specificare un solo package per ciascun file sorgente
Se non si dichiara nessun package allora la classe appartiene
ad un package di default
Package & Exception
Gianmaria Mancosu
7
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 8
Package vs Namespace
l
Questa tabella mostra il parallelo tra package
e namespace in C/C++
Operazione
Entità singola
Raggruppamento
Risoluzione di scope
Definizione
Utilizzo
Package & Exception
C/C++
Java
classe
classe
namespace
package
::
.
namespace <nome> { }
package <nome>;
using namespace
import
Gianmaria Mancosu
8
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 9
Package Declaration
l
Per esempio la classe Square nel diagramma
precedente che appartiene al package model che a
sua volta appartiene al package più generale
painter si può definire in questo modo:
package painter.model;
public class Square extends Figure {
...
}
Package & Exception
Gianmaria Mancosu
9
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 10
Package Usage
l
l
Per utilizzare le classi contenute in un package occorre
importarlo tramite la keyword import
È possibile importare tutte le classi di un package utilizzando
l’asterisco (*) o solo una classe specificandone il nome
package painter.model;
import painter.printer.*;
import java.io.*;
import java.util.Vector;
public class Square extends Figure {
Vector points = new Vector();
...
}
Package & Exception
Gianmaria Mancosu
10
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 11
Package Standard
l
java.lang
l
l
l
java.io
l
l
Contiene tutte le classi dedicate al I/O da tastiera e da file
java.util
l
l
l
Contiene tutte le classi principali del linguaggio, tra cui String,
Array, Number, Object, System
Viene importata automaticamente dal compilatore
Contiene le collezioni, vari algoritmi di trattamento delle
collezioni, e tante altre classi utili durante lo sviluppo
Ad esempio, contiene le classi Vector, Hashtable, Date, Time
java.awt
l
Contiene le classi di gestione dell’interfaccia grafica
indipendenti dal sistema operativo
Package & Exception
Gianmaria Mancosu
11
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 12
Modificatori di Accesso
l
Java permette un ulteriore modificatore di accesso (oltre a
public, protected, private) che agisce a livello di package
l
l
l
l
Consente di accedere a variabili o metodi anche dalle classi non
derivate purché appartenenti allo stesso package
Serve per rendere più semplice lo scambio di dati o messaggi tra
le classi di uno stesso package
Costituisce una violazione del principio dell’information hiding
(come friend in C++)
È il livello di default se non è esplicitamente indicato uno dei
modificatori public, protected, private:
void packageMethod(int par) { ... }
Package & Exception
Gianmaria Mancosu
12
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 13
Modificatori di Accesso
l
l
l
Il modificatore di accesso di default risulta quindi
meno restrittivo di private perché consente di
accedere anche a slot di classi diverse
Risulta più restrittivo di protected, perché le classi
derivate che non appartengono allo stesso package
non possono accedere agli slot con accesso default
La conseguenza è che gli slot marcati con protected
possono essere visti anche da classi non derivate, se
queste appartengono allo stesso package
Package & Exception
Gianmaria Mancosu
13
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 14
Modificatori di Accesso
Modificatore
Classe
Package
Sottoclasse
private
OK
default
OK
OK
protected
OK
OK
OK
public
OK
OK
OK
Package & Exception
Universo
OK
Gianmaria Mancosu
14
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 15
Modificatori di Accesso
package first;
public class AClass {
private int privateSlot ;
int defaultSlot ;
protected int protectedSlot ;
}
Stesso
package
package first;
public class AnotherClass {
public void publicMethod() {
AClass obj = new AClass() ;
obj.privateSlot = 0 ; // NO!!!
obj.defaultSlot = 0 ; // YES!!!
obj.protectedSlot = 0 ; // YES!!!
}
}
Package & Exception
Gianmaria Mancosu
15
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 16
Modificatori di Accesso
package first;
public class AClass {
private int privateSlot ;
int defaultSlot ;
protected int protectedSlot ;
}
Diverso
package
package second;
public class AnotherClass {
public void publicMethod() {
AClass obj = new AClass() ;
obj.privateSlot = 0 ; // NO!!!
obj.defaultSlot = 0 ; // NO!!!
obj.protectedSlot = 0 ; // NO!!!
}
}
Package & Exception
Gianmaria Mancosu
16
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 17
Modificatori di Accesso
package first;
public class AClass {
private int privateSlot ;
int defaultSlot ;
protected int protectedSlot ;
}
Diverso
package
package second;
public class AnotherClass extends Aclass {
public void publicMethod() {
this.privateSlot = 0 ; // NO!!!
this.defaultSlot = 0 ; // NO!!!
this.protectedSlot = 0 ; // YES!!!
}
}
Package & Exception
Gianmaria Mancosu
17
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 18
Package Summary
l
l
l
l
I package sono uno strumento per raggruppare le
classi o sottopackage che sono attinenti per
funzionalità o scopo
La keyword package permette di definire la
collocazione di una classe
La keyword import permette di utilizzare le classi di
altri package
Se non viene specificato alcun modificatore di
accesso, un metodo o una variabile si considera di
default accessibile da tutte le classi nello stesso
package
Package & Exception
Gianmaria Mancosu
18
Gestione degli
Errori e delle
Eccezioni in Java
Corso di Linguaggi di
Programmazione ad Oggetti 1
A.A. 2003/04
A cura di
Gianmaria Mancosu
19
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 20
Exceptions
l
l
Come vengono trattati gli errori di esecuzione
dagli altri linguaggi?
Se fate l’ipotesi che il vostro codice funzioni
bene, e invece qualche congettura non è
corretta, cosa può succedere?
Package & Exception
Gianmaria Mancosu
20
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 21
Exceptions
l
Checked Exceptions
l
l
l
Condizioni di errore che possono capitare in un
programma corretto
Ci si aspetta che il programmatore debba gestirli
Unchecked Exceptions
l
l
l
l
Problemi solitamente gravi o bug
Difficilmente recuperabili
Non ci si aspetta che il programmatore debba recuperare
la situazione
Solitamente comportano l’uscita dal programma
Package & Exception
Gianmaria Mancosu
21
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 22
Exceptions
l
Checked Exceptions
l
l
Rappresentati dalla classe Exception
Esempi:
l
l
l
File not found
Network error
Unchecked Exceptions
l
l
l
Situazioni fatali sono rappresentati dalla classe Error
Possibili bug sono rappresentati dalla classe RuntimeException
Esempi:
(Error o RuntimeException?)
l
l
Out of bounds, Division by zero
Out of memory, Stack overflow
Package & Exception
Gianmaria Mancosu
22
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 23
Exception Hierarchy
Object
Throwable
Error
Exception
RuntimeException
Checked Exceptions
Unchecked Exceptions
Package & Exception
Gianmaria Mancosu
23
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 24
Exception Hierarchy
l
Error
l
VirtualMachineError
l
l
l
l
AWTError
RuntimeException
l
l
l
l
StackOverflowError
OutOfMemroyError
ArithmeticException
NullPointerException
IndexOutOfBoundException
Exception
l
IOException
l
l
l
l
EOFException
FileNotFoundException
ClassNotFoundException
SQLException
Package & Exception
Gianmaria Mancosu
24
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 25
Exception Example
1 public class MathException {
2
public static void main(String[] args) {
3
int nLati = 4;
4
int perimetro = 36;
5
while (nLati<10) {
6
System.out.println("lato : " + (perimetro / nLati));
7
nLati--;
8
}
9
}
10 }
java.lang.ArithmeticException: / by zero
java.lang.ArithmeticException:
at testjava.MathException.main(MathException.java:6)
Exception in thread "main"
Package & Exception
Gianmaria Mancosu
25
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 26
Exceptions
l
Un metodo che rileva un eccezione può segnalarla con la keyword
throw:
if (cond)
throw new ConditionFailedException();
l
l
l
l
Il metodo può gestire l’eccezione da solo, altrimenti viene interrotto e il
controllo passa al metodo chiamante
Se il metodo chiamante non è in grado di gestire l’eccezione passa il
controllo al proprio chiamante
Il meccanismo prosegue e l’eccezione risale nello stack delle chiamate
dei metodi (bubbling)
Se l’eccezione non viene gestita provoca l’uscita con errore dal
programma (killed)
Package & Exception
Gianmaria Mancosu
26
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 27
Exception Bubbling
main()
main()
primo()
primo()
secondo()
secondo()
Package & Exception
Gianmaria Mancosu
27
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 28
Exception Handling
l
l
l
l
Consiste nel definire un comportamento
personalizzato nel caso di una eccezione
Dopo la gestione il programma può continuare con
la sua esecuzione
Il meccanismo è fatto in modo da distinguere il
flusso normale del programma dalla gestione dei
casi particolari
Maggiore leggibilità
Package & Exception
Gianmaria Mancosu
28
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 29
Exception Handling
try {
// codice che può sollevare delle eccezioni
// viene detto: codice protetto
} catch (TypeException e) {
// codice che viene eseguito se viene sollevata
// un’eccezione di tipo TypeException
} catch (AnotherTypeException e) {
// codice che viene eseguito se viene sollevata
// un’eccezione di tipo AnotherTypeException
}
Package & Exception
Gianmaria Mancosu
29
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 30
Exception Handling
main()
main()
catch
handle()
handle()
Package & Exception
try
primo()
primo()
secondo()
secondo()
Gianmaria Mancosu
30
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 31
Exception Handling
l
l
l
Quando viene gestita un’eccezione il controllo
passa alla fine del blocco try-catch che l’ha gestita
Un modo per eseguire sempre un blocco di codice
indipendentemente dalla cattura di una eccezione è
quello di utilizzare l’istruzione finally
Da utilizzarsi, ad esempio, per:
l
l
l
rilasciare le risorse allocate (grafiche, memoria)
chiudere file o canali di comunicazioni
rilasciare semafori (evita i deadlock)
Package & Exception
Gianmaria Mancosu
31
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 32
Exception Handling
try {
// codice che può sollevare delle eccezioni
} catch (TypeException e) {
// codice che viene eseguito se viene sollevata
// un’eccezione di tipo TypeException
} finally {
// codice che viene sempre eseguito anche se
// non viene sollevata nessuna eccezione
}
Package & Exception
Gianmaria Mancosu
32
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 33
Exception Declaration
l
l
Ogni metodo che vuole gestire le eccezioni deve utilizzare i blocchi
try-catch
Se il metodo può sollevare un’eccezione non di runtime, deve
dichiararlo tramite la keyword throws
void read() throws IOException
l
Se un metodo non gestisce le eccezioni sollevate durante la sua
esecuzione delegandole al chiamante, deve dichiararlo sempre
con throws
void fileRead() throws IOException, BindException
l
Solo gli errori e le eccezioni di runtime non necessitano di essere
dichiarate esplicitamente nella definizione di un metodo
Package & Exception
Gianmaria Mancosu
33
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 34
Exception Usage
l
Un oggetto di tipo Exception contiene
informazioni che specificano meglio cosa
è successo e cosa stava avvenendo in
quel momento:
l
String getMessage()
l
l
restituisce il messaggio di errore
void printStackFrame()
l
stampa il contenuto dello stack al momento
dell’eccezione
Package & Exception
Gianmaria Mancosu
34
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 35
Exception Usage
l
Esempio di utilizzo di printstackFrame()
catchedException.printStackFrame();
>> java.io.FileNotFoundException: HTML (Is a directory)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:116)
at java.io.FileOutputStream.<init>(FileOutputStream.java:76)
at net.sourceforge.cruisecontrol.Project.serializeProject(Project.java:186)
at net.sourceforge.cruisecontrol.Project.build(Project.java:175)
at net.sourceforge.cruisecontrol.Project.execute(Project.java:98)
at net.sourceforge.cruisecontrol.Main.main(Main.java:79)
at CruiseControl.main(CruiseControl.java:68)
Package & Exception
Gianmaria Mancosu
35
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 36
User Defined Exception
l
l
l
È possibile definire le proprie eccezioni
semplicemente ereditando da Exception o
da una sua sottoclasse
È possibile anche definire una propria
gerarchia di eccezioni
Le eccezioni dell’utente si possono
sollevare e catturare esattamente come
quelle standard
Package & Exception
Gianmaria Mancosu
36
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 37
User Defined Exception
public class MyException extends java.lang.Exception {
public MyException() {
super();
}
public MyException(String message) {
super(message);
}
}
// esempio di utilizzo
...
throw new MyException();
...
catch(MyException e) { e.printStackFrame(); }
...
Package & Exception
Gianmaria Mancosu
37
Corso di Linguaggi di Programmazione ad Oggetti - 1
Slide 38
Exception Summary
l
l
l
l
l
Le eccezioni sono degli eventi di errore o di malfunzionamento
che si verificano durante l’esecuzione di un programma
Le eccezioni possono essere sollevate tramite la keyword throw
Le eccezioni di tipo checked vanno obbligatoriamente gestite
tramite il costrutto try-catch-finally o segnalate nella
dichiarazione di metodo tramite la keyword throws
Le eccezioni di tipo unchecked non vanno obbligatoriamente
gestite ma possono comunque essere catturate tramite trycatch-finally per rilasciare le risorse prima del termine del
programma
È possibile definire la propria gerarchia di eccezioni estendendo
quelle standard
Package & Exception
Gianmaria Mancosu
38