errors and exceptions - w3.ualg.ptw3.ualg.pt/~jvo/poo2017-18/poo2017-18t14.pdf · 10 [email protected]...

22
1 José Valente de Oliveira 14-1 José 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 14-2 [email protected] José Valente de Oliveira Overview n Introdução n Testes e Testes unitários n Noção de Exceção n A hierarquia Throwable e as exceções pré-definidas do Java n O lançamento de exceções e o sinalizador throw n A clausula throws n O manipulador de exceções catch e os blocos try e finally n Exceções definidas pelo programador n Asserções n Conclusões

Upload: others

Post on 09-Mar-2020

20 views

Category:

Documents


0 download

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