errors and exceptions - w3.ualg.ptw3.ualg.pt/~jvo/poo2017-18/poo2017-18t14.pdf · 10 [email protected]...
TRANSCRIPT
1
José Valente de Oliveira 14-1José Valente de Oliveira 14-1
Errors and exceptions
Bruce Eckel, Thinking in Java, 4th edition, PrenticeHall, New Jersey, cf. http://mindview.net/Books/TIJ4
José Valente de Oliveira [email protected] José Valente de Oliveira
Overviewn Introduçãon Testes e Testes unitáriosn Noção de Exceçãon A hierarquia Throwable e as exceções pré-definidas do
Javan O lançamento de exceções e o sinalizador thrown A clausula throwsn O manipulador de exceções catch e os blocos try e
finallyn Exceções definidas pelo programadorn Asserçõesn Conclusões
2
José Valente de Oliveira [email protected] José Valente de Oliveira 10-3
Alguns tipos de erros durante a execução de um programa
José Valente de Oliveira [email protected] José Valente de Oliveira 10-4
Erros lógicos depuram-se (quando detetados)!
3
José Valente de Oliveira 14-5
Test typesn Unit
q Smallest testable part of a program (method)
n Componentq Class or group of related classes
n Integrationq Interaction between components
José Valente de Oliveira [email protected] José Valente de Oliveira
Unit test characteristicsn Very limited in scope
n Independent from each other
n Run each time something is changed
n Run automatically
n Run fast; the fastest the better
4
José Valente de Oliveira [email protected] José Valente de Oliveira
Testes implementam-se antes do código!
José Valente de Oliveira [email protected] José Valente de Oliveira
Melhore a testabilidade do seu código
5
José Valente de Oliveira [email protected] José Valente de Oliveira
Error handling
José Valente de Oliveira [email protected] José Valente de Oliveira
Classical techniques for error handling
6
José Valente de Oliveira [email protected] José Valente de Oliveira
Exceptionn In programming, an exception is a description
of an unexpected runtime event
n In Java, an exception is represented by an object of the Throwable hierarchy
14-12
A hierarquia Throwable e as exceções pré-definidas do Java
7
José Valente de Oliveira [email protected] José Valente de Oliveira
Checked vs unchecked exceptionsn Checked Exceptions
Must either be caught by a method or declared in its signature.
n Unchecked ExceptionsNot required to be caught or declared on a method, including:q Errors generated by the JVMq Runtime exceptions generated by either methods or the
JVM itself.
José Valente de Oliveira [email protected] José Valente de Oliveira
/** @version 1.0 */public class Fraction {
private int num, den;public int numerator() {return num;}public int denominator() {return den;}public Fraction() { this(0); } public Fraction(int n) { num= n; den = 1; }public Fraction (int n, int d) {
if (d ==0) {System.err.print("Fraction.denominator() cannot be zero");System.exit(1); // We will have to improve this later
} if (d<0) {
this.num = -n;this.den = -d;
} else {num = n; // same as this.num =n;den = d;
}int k =mdc(Math.abs(num), den);num /= k;den /= k;
}
Example: the class Fraction, again
8
José Valente de Oliveira [email protected] José Valente de Oliveira
O lançamento de excepções e o sinalizador throw
/** @version 2.0*/class Fraction {
private int num, den;
public Fraction (int n, int d) {if (d==0)
throw new ArithmeticException(“Attempting to create a Fraction with a null denominator”);
// … como antes …}
}
14-16
A hierarquia Throwable e as excepções pré-definidas do Java
9
José Valente de Oliveira [email protected] José Valente de Oliveira
E um possível clienteint n, d;// …try {
Fraction f = new Fraction (n, d);System.out.print(f);
} catch(ArithmeticException e) {System.err.print(e);
}
José Valente de Oliveira [email protected] José Valente de Oliveira
Keywords for Java Exceptionsn throws
Declares the (checked) exceptions which can be raised by a method.
n throwRaises an exception to the first available handler.
n trySets the start of a block associated with a set of exception handlers.
n catchIf the block enclosed by the try generates an exception of this type, control moves here.
n finallyAlways called when the try block concludes, and after any necessary catch handler is complete.
10
José Valente de Oliveira [email protected] José Valente de Oliveira
n Introduçãon Testes e Testes unitáriosn Noção de Excepçãon A hierarquia Throwable e as excepções pré-definidas do
Javan O lançamento de excepções e o sinalizador thrown A clausula throwsn O manipulador de excepções catch e os blocos try e
finallyn Excepções definidas pelo programadorn Asserçõesn Conclusões
Até agora…
José Valente de Oliveira [email protected] José Valente de Oliveira
Example: clone() as defined in Object
protected Object clone() throws CloneNotSupportedException
Object {abstract}
+equals(anObject)#clone()
11
José Valente de Oliveira [email protected] José Valente de Oliveira
Uma classe pode adoptar 1 das seguintes políticas de clonagem
1. Suporta clonagem
2. Suporta clonagem condicionalmente
3. Não suporta clonagem mas não se importa que as suas subclasses suportem
4. Proíbe clonagem
Política 1. Suporta clonagem
n Para suportar clonagem, uma classe:
1. declara implementar a interface Cloneablee
2. fornece uma redefinição do métodoclone() com visibilidade pública onde nãose declara o lançamento de qualquerexceção
[email protected] José Valente de Oliveira 14-22
12
José Valente de Oliveira [email protected] José Valente de Oliveira
Política 1. Suporta clonagem, exemplo /** @version 2.0*/class Point implements Cloneable {
// …public Object clone() {
try {return super.clone();
}catch (CloneNotSupportedException e) {
// O fluxo de controlo nunca deverá passar por aqui. // Se por acaso passar, algo de muito errado aconteceuthrow new InternalError();
}}
}
José Valente de Oliveira [email protected] José Valente de Oliveira
Point adopta política 1, código cliente
Point p = new Point(1, 2);Point q = (Point) p.clone();
p.setX(0);System.out.println(p);System.out.println(q)
13
José Valente de Oliveira [email protected] José Valente de Oliveira
Fraction adopta política 1/** @version 2.0*/class Fraction implements Cloneable {
// …public Object clone() {
try {return super.clone();
}catch (CloneNotSupportedException e) {// O fluxo nunca deverá passar por aqui. // Se por acaso passar, algo de muito errado aconteceu
throw new InternalError();}
}}
José Valente de Oliveira [email protected] José Valente de Oliveira
Point adopta política 1// versão simples mas ERRADA!public Object clone() {
return new Point(this.x, this.y);}
Class Pixel extends Point implements Cloneable {//…
}//…
Pixel p = new Pixel(1, 2, R, G, B);Pixel impossible = (Pixel) p.clone(); //ERRO. POR QUÊ?
14
José Valente de Oliveira [email protected] José Valente de Oliveira
Política 2: Suporta clonagem condicionalmente
n Para suportar clonagem condicional, umaclasse declara implementar a interfaceCloneable e fornece uma redefinição dométodo clone() com visibilidade pública ondeainda se declara o lançamento da exceçãoCloneNotSupportedException.
José Valente de Oliveira [email protected] José Valente de Oliveira
Uma implementação de IStack adopta política 2
/** @version */class AStack implements IStack, Cloneable {
private Object [] elements;//...
public Object clone() throws CloneNotSupportedException {AStack newStack = (AStack) super.clone();newStack.elements = (Object []) elements.clone();return newStack;
}}
15
José Valente de Oliveira [email protected] José Valente de Oliveira
Uma classe pode adoptar 1 das seguintes políticas de clonagem
José Valente de Oliveira [email protected] José Valente de Oliveira
Uma classe pode adoptar 1 das seguintes políticas de clonagem
16
José Valente de Oliveira [email protected] José Valente de Oliveira
try, catch, finally… again
“try {“expressão*
“}”“catch (“exception_type identificador”) {“
expressão* “}”*[ “finally {“ expressão* “}” ]
José Valente de Oliveira [email protected] José Valente de Oliveira
Finally in actionpublic class OnOff {static boolean On=true;public static void main(String[] args) {
try {System.out.println("Inside the first try");try {
if (On) throw new Exception();System.out.println("Inside the second try");
} finally {System.err.println("In finally clause");On = false;
}System.out.println("Ignored in the presence of an exception.");
} catch(Exception e) {e.printStackTrace();
} System.out.println("On: " + On);
}}
17
José Valente de Oliveira [email protected] José Valente de Oliveira
Excepções definidas pelo utilizador
class MyException extends Exception {}
José Valente de Oliveira [email protected] José Valente de Oliveira
Example: the graphic editor, again
The task is to develop a graphic editor which is able to maintan and operate 2D geometric figures. More specifically, the editor should be able of, given a square, generate the tangential inner circumference.
The square will be given by 2 suitable points defining its diagonals. For the sake of simplicity, the sides of the square are always parallel to the axis. Obviously, 2 points define a square when the distance between coordinates in x are equals to distances coordinates in y.
A circumference is represented by its center (a point) and a radius (a double)
18
José Valente de Oliveira [email protected] José Valente de Oliveira
An instance of the problem
José Valente de Oliveira [email protected] José Valente de Oliveira
A possible class diagram
19
José Valente de Oliveira [email protected] José Valente de Oliveira
Excepções definidas pelo utilizador
class GeoException extends Exception {public GeoException() {super(); }public GeoException(String s) {super(s); }
}
José Valente de Oliveira [email protected] José Valente de Oliveira
class GeoSquareException extends GeoException {private Ponto A, B;public GeoSquareException() {super(); }public GeoSquareException(String s) {super(s); }public GeoSquareException(String s, Ponto p, Ponto q) {
super(s); A = p; B=q;
}public getA() {return A; }public getB() {return B; }
}
Excepções definidas pelo utilizador
20
José Valente de Oliveira [email protected] José Valente de Oliveira
Excepções definidas pelo utilizador
/** @version 2.0*/class Quadrado {
private Ponto A, B;public Quadrado(Ponto p, Ponto q) throws GeoSquareException {
if ( ! validaPontos(p, q) )throw new GeoSquareException(“Invalid:”, p ,q);
A = p; B = q;
}//....
}
José Valente de Oliveira [email protected] José Valente de Oliveira
Excepções definidas pelo utilizador
try {Quadrado umQuadrado = new Quadrado(p, q);
} catch (GeoSquareException e) {System.err.print(e.getA() + “ e “ +e.getB() + “não definem
um quadrado”);
}
21
José Valente de Oliveira [email protected] José Valente de Oliveira
Assertions
“assert” expression [“: “expression];
José Valente de Oliveira [email protected] José Valente de Oliveira
Check point
n Something is wrong here. What it is?
try { /*…*/ }catch (Exception e) {/*…*/ }
catch (ArrayIndexOutOfBounds ae) {/*…*/ }
22
José Valente de Oliveira [email protected] José Valente de Oliveira
n Introduçãon Testes e Testes unitáriosn Noção de Excepçãon A hierarquia Throwable e as excepções pré-definidas do
Javan O lançamento de excepções e o sinalizador thrown A clausula throwsn O manipulador de excepções catch e os blocos try e
finallyn Excepções definidas pelo programadorn Asserçõesn Conclusões
Summary