class Line {
Point pt1, pt2;
Line (Point p, Point q) {
if (p.equals(q)) {
//Errore!
}
pt1=p;
pt2=q;
}
}
Le eccezioni sono oggetti in Java. Esiste una class Exception.
Si può creare una eccezione usando il costruttore vuoto new Exception() o il costruttore con una stringa new Exception("message").
Le eccezioni sono sollevate (throw) e un metodo (o un costruttore)
che può sollevare un'eccezione deve dirlo.
class Line {
Point pt1, pt2;
Line (Point p, Point q) throws Exception {
if (p.equals(q)) {
throw new Exception("Not A Line");
}
pt1=p;
pt2=q;
}
}
Si può essere più specifici e creare le proprie eccezioni.
class NotALine extends Exception {
}
class Line {
Point pt1, pt2;
Line (Point p, Point q) throws NotALine {
if (p.equals(q)) {
throw new NotALine();
}
pt1=p;
pt2=q;
}
}
Un metodo o un costruttore possono sollevare più di un tipo di eccezioni:
class NotALine extends Exception {
}
class Uninitialised extends Exception {
}
class Line {
Point pt1, pt2;
Line (Point p, Point q) throws Uninitialised, NotALine {
if (p==null || q == null) {
throw new Uninitialised();
}
if (p.equals(q)) {
throw new NotALine();
}
pt1=p;
pt2=q;
}
}
Le eccezioni sono un'alternativa più pulita di quella che consiste nel codificare l'errore nel valore restituito. Esempio:
class Line {
Point pt1, pt2;
Line (Point p, Point q) {
if (!(p==null || q==null || p.equals(q))) {
pt1=p;
pt2=q;
}
}
}
I catch sono selezionati nel'ordine del programma,
non è il più specifico che è scelto.
Il finally è sempre
eseguito anche se il try finisce senza eccezioni.
class Line {
Point pt1,pt2;
Line (Point p, Point q) throws Uninitialised, NotALine {
if (p==null || q == null) {
throw new Uninitialised();
}
if (p.equals(q)) {
throw new NotALine();
}
pt1=p;
pt2=q;
}
int deltaX() {
return pt1.x-pt2.x;
}
int deltaY() {
return pt1.y-pt2.y;
}
boolean parallel(Line l) {
return (deltaX()*l.deltaY())==(deltaY()*l.deltaX());
}
boolean in(Point pt) {
return parallel(new Line(pt1,pt));
}
}
Bisogna recuperare le eccezioni usando il try
boolean in(Point pt) {
try {
return parallel(new Line(pt1,pt));
}
catch (NotALine e) {
return true;
}
catch (Unintialised e) {
return false;
}
}
o
boolean in(Point pt) throws Uninitialised {
try {
return parallel(new Line(pt1,pt));
}
catch (NotALine e) {
return true;
}
catch (Unintialised e) {
throw e;
}
}
o
boolean in(Point pt) throws Uninitialised {
try {
return parallel(new Line(pt1,pt));
}
catch (NotALine e) {
return true;
}
}
Subclass di RuntimeException
Subclass di Error
static void fillArray(int[] a, int first, int last, int value) {
for(int i=first; i<last; i++) {
a[i]=value;
}
}
Forse andiamo oltre la lunghezza di a:
static void fillArray(int[] a, int first, int last, int value) {
try {
for(int i=first; i<last; i++) {
a[i]=value;
}
}
catch (IndexOutOfBoundsException e) {
}
}
F2*. Riscrivere i metodi getPath e getTree dall'esercizio D7 in tale mode che l'eccezione NotFoundException è sollevata se è richiesto un camino di un sotto-albero che non appartienne all'albero e se è chiesto un sotto-albero con un camino invalido.
F3*. Riscrivere i metodi dall'esercizion C4 in tale modo che ogni problema con la dimensione delle matrice vienne riportato con l'eccezione IllegalDimension}.