1
Matteo Baldoni
Dipartimento di Informatica - Universita` degli Studi di Torino C.so Svizzera, 185 - I-10149 Torino (Italy) e-mail: [email protected] - URL: http://www.di.unito.it/~baldoni
Linguaggi di Programmazione:
Paradigmi di Programmazione
ECCEZIONI e THREAD (lucidi originali di Alberto Martelli)
Linguaggi di Programmazione: Paradigmi di Programmazione 2
Eccezioni
• Eccezioni: meccanismo per trattare condizioni eccezionali
– divisione per zero
– indice di array fuori dai limiti – ...
• L'esecuzione si blocca e viene sollevata (lanciata) una eccezione.
Linguaggi di Programmazione: Paradigmi di Programmazione 3
Eccezioni
class Ecc {
static int[] a = new int[2];
static void p() {a[4] = 5;}
public static void main (String[] args) { p();}
}
Eseguendo il main viene fornito il seguente messaggio di errore a run-time
Exception in "main"
java.lang.ArrayIndexOutOfBoundsException at Ecc.p (Ecc.java: 3)
at Ecc.main (Ecc.java: 5)
Linguaggi di Programmazione: Paradigmi di Programmazione 4
Classi eccezioni
• Una eccezione è un oggetto della classe Exception o di una sua sottoclasse.
Exception
RuntimeException
IndexOutOfBoundsExc. NullPointerExc.
ArithmeticExc.
Linguaggi di Programmazione: Paradigmi di Programmazione 5
throw
• Le eccezioni possono essere lanciate con: throw
<eccezione>
class Tabella { int n; int[] a;
void inserisci(int x) { if (n >= a.length - 1)
throw new RuntimeException("tabella piena");
...
public static void main (String[] args) { Tabella t = new Tabella(2);
t.inserisci(5); t.inserisci(8);
...
Runtime exception: tabella piena at Tabella.inserisci ...
at Tabella main ...
Linguaggi di Programmazione: Paradigmi di Programmazione 6
Catturare le eccezioni
• Chi lancia una eccezione non ha informazioni sufficienti per decidere cosa fare.
• Invece di bloccare comunque l'esecuzione, l'eccezione
può essere catturata ad un livello più alto da un
exception handler, che può decidere come continuare
l'esecuzione del programma dopo aver preso le misure
opportune.
2
Linguaggi di Programmazione: Paradigmi di Programmazione 7
Catturare le eccezioni
class Tabella { int n; int[] a;
void inserisci(int x) { if (n >= a.length - 1)
throw new RuntimeException("tabella piena");
...
public static void main (String[] args) { Tabella t = new Tabella(2);
try {
t.inserisci(5);
t.inserisci(8);
} catch(RuntimeException e) { System.out.println(e.getMessage());
}
Linguaggi di Programmazione: Paradigmi di Programmazione 8
try - catch
• In generale un exception handler ha la forma:
dove Tipo1, Tipo2, ... sono tipi di eccezioni.
try {
codice che può generare una eccezione } catch(Tipo1 id1) {
gestisce eccez. di Tipo1 } catch(Tipo2 id2) {
gestisce eccez. di Tipo2 }...
Linguaggi di Programmazione: Paradigmi di Programmazione 9
Come catturare le eccezioni
• Quando viene lanciata una eccezione, si interrompe l'esecuzione e si cerca dinamicamente, percorrendo all'indietro lo stack delle chiamate, il primo exception handler che ha una catch per il tipo dell'eccezione lanciata, e l'esecuzione riprende da quel punto.
• Nell'esempio precedente catch cattura qualunque eccezione a runtime.
• E' possibile definirsi una propria eccezione come sottoclasse di RuntimeException.
Linguaggi di Programmazione: Paradigmi di Programmazione 10
Eccezioni definite
class TabellaPiena extends RuntimeException { public int i;
public TabellaPiena(int n) {i=n;}
}
class Tabella {...
void inserisci(int x) { if (n >= a.length - 1) throw new TabellaPiena(x);
...
public static void main (String[] args) { Tabella t = new Tabella(2);
try {
...
} catch(TabellaPiena tp) {
System.out.println("La tabella è piena." + tp.i + " non è stato inserito");
}
Linguaggi di Programmazione: Paradigmi di Programmazione 11
throws
• Se un metodo può lanciare un'eccezione e non la cattura, deve segnalarlo con throws (tranne che per RuntimeException).
class Generica {
void m(String s) throws ClassNotFoundException { Class c = Class.forName(s);
...
Linguaggi di Programmazione: Paradigmi di Programmazione 12
Exception handler generale
• Il blocco di finally è eseguito sempre, anche se non sono sollevate eccezioni
try {
codice che può generare una eccezione } catch(Tipo1 id1) {
gestisce eccez. di Tipo1 } catch(Tipo2 id2) {
gestisce eccez. di Tipo2 }...
} finally {....}
3
Linguaggi di Programmazione: Paradigmi di Programmazione 13
Thread
• Thread: flusso sequenziale di controllo (esecuzione di istruzioni) in un programma.
• Nello stesso programma si possono far partire più thread che sono eseguiti concorrentemente.
• Tutti i thread condividono le stesse variabili del programma, a differenza dai processi che hanno ciascuno il proprio contesto.
• Nei computer a singola CPU la concorrenza viene simulata con una politica di scheduling che alterna l'esecuzione dei singoli thread.
Linguaggi di Programmazione: Paradigmi di Programmazione 14
Thread
• Una applicazione Java che usa i thread può eseguire più attività contemporaneamente. Esempio: aggiornare l'informazione grafica sull schermo e accedere alla rete.
• In alcuni casi i thread possono procedere in modo indipendente uno dall'altro (comportamento asincrono), in altri devono essere sincronizzati fra loro (es.
produttore - consumatore).
Linguaggi di Programmazione: Paradigmi di Programmazione 15
Come si crea un thread (1)
• Si definisce una classe che eredita da Thread e che implementa un metodo run().
• Quando si crea un oggetto di questa classe si esegue il suo metodo start() per far partire il thread.
class MioThread extends Thread { public void run() {
System.out.println("Sono il thread " + getName());
}}
....
MioThread t1 = new MioThread();
MioThread t2 = new MioThread();
t1.start();
t2.start();
Linguaggi di Programmazione: Paradigmi di Programmazione 16
Come si crea un thread (2)
• Si definisce una classe che implementa l'interfaccia
Runnableche possiede il metodo
run.class Esempio implements Runnable { public void run() {...}}
• Per attivare un thread:
Esempio es = new Esempio();
Thread t = new Thread(es), t.start();
Linguaggi di Programmazione: Paradigmi di Programmazione 17
Come si crea un thread (2)
class MioThread implements Runnable { public void run() {
System.out.println("Sono il thread " + Thread.currentThread().getName());
}}
....
MioThread mt = new MioThread();
Thread t1 = new Thread(mt);
Thread t2 = new Thread(mt);
t1.start();
t2.start();
Linguaggi di Programmazione: Paradigmi di Programmazione 18