Errors ad exceptios Bruce Eckel, Thikig i Java, 4th editio, PreticeHall, New Jersey, cf. http://midview.et/books/tij4 José Valete de Oliveira 14-1 Overview Itrodução Testes e Testes uitários Noção de Exceção A hierarquia Throwable e as exceções pré-defiidas do Java O laçameto de exceções e o sializador throw A clausula throws O maipulador de exceções catch e os blocos try e fially Exceções defiidas pelo programador Asserções Coclusões José Valete de Oliveira 14-2 1
Algus tipos de erros durate a execução de um programa José Valete de Oliveira 14-3 10-3 Erros lógicos depuram-se (quado detetados)! José Valete de Oliveira 14-4 10-4 2
Test types Uit q Smallest testable part of a program (method) Compoet q Class or group of related classes Itegratio q Iteractio betwee compoets José Valete de Oliveira 14-5 Uit test characteristics Very limited i scope Idepedet from each other Ru each time somethig is chaged Ru automatically Ru fast; the fastest the better José Valete de Oliveira 14-6 3
Testes implemetam-se ates do código! José Valete de Oliveira 14-7 Melhore a testabilidade do seu código José Valete de Oliveira 14-8 4
Error hadlig José Valete de Oliveira 14-9 Classical techiques for error hadlig José Valete de Oliveira 14-10 5
Exceptio I programmig, a exceptio is a descriptio of a uexpected rutime evet I Java, a exceptio is represeted by a object of the Throwable hierarchy José Valete de Oliveira 14-11 A hierarquia Throwable e as exceções pré-defiidas do Java 14-12 6
Checked vs uchecked exceptios Checked Exceptios Must either be caught by a method or declared i its sigature. Uchecked Exceptios Not required to be caught or declared o a method, icludig: q Errors geerated by the JVM q Rutime exceptios geerated by either methods or the JVM itself. José Valete de Oliveira 14-13 /** @versio 1.0 */ public class Fractio { Example: the class Fractio, agai private it um, de; public it umerator() {retur um; public it deomiator() {retur de; public Fractio() { this(0); public Fractio(it ) { um= ; de = 1; public Fractio (it, it d) { if (d ==0) { System.err.prit("Fractio.deomiator() caot be zero"); System.exit(1); // We will have to improve this later if (d<0) { this.um = -; this.de = -d; else { um = ; // same as this.um =; de = d; it k =mdc(math.abs(um), de); um /= k; de /= k; José Valete de Oliveira 14-14 7
O laçameto de excepções e o sializador throw /** @versio 2.0 */ class Fractio { private it um, de; public Fractio (it, it d) { if (d==0) throw ew ArithmeticExceptio( Attemptig to create a Fractio with a ull deomiator ); // como ates José Valete de Oliveira 14-15 A hierarquia Throwable e as excepções pré-defiidas do Java 14-16 8
E um possível cliete it, d; // try { Fractio f = ew Fractio (, d); System.out.prit(f); catch(arithmeticexceptio e) { System.err.prit(e); José Valete de Oliveira 14-17 Keywords for Java Exceptios throws Declares the (checked) exceptios which ca be raised by a method. throw Raises a exceptio to the first available hadler. try Sets the start of a block associated with a set of exceptio hadlers. catch If the block eclosed by the try geerates a exceptio of this type, cotrol moves here. fially Always called whe the try block cocludes, ad after ay ecessary catch hadler is complete. José Valete de Oliveira 14-18 9
Até agora Itrodução Testes e Testes uitários Noção de Excepção A hierarquia Throwable e as excepções pré-defiidas do Java O laçameto de excepções e o sializador throw A clausula throws O maipulador de excepções catch e os blocos try e fially Excepções defiidas pelo programador Asserções Coclusões José Valete de Oliveira 14-19 Example: cloe() as defied i Object Object {abstract +equals(aobject) #cloe() protected Object cloe() throws CloeNotSupportedExceptio José Valete de Oliveira 14-20 10
Uma classe pode adoptar 1 das seguites políticas de cloagem 1. Suporta cloagem 2. Suporta cloagem codicioalmete 3. Não suporta cloagem mas ão se importa que as suas subclasses suportem 4. Proíbe cloagem José Valete de Oliveira 14-21 Política 1. Suporta cloagem Para suportar cloagem, umaclasse: 1. declara implemetar a iterface Cloeable e 2. forece uma redefiição do método cloe() com visibilidade pública ode ão se declara o laçameto de qualquer exceção José Valete de Oliveira 14-22 11
Política 1. Suporta cloagem, exemplo /** @versio 2.0 */ class Poit implemets Cloeable { // public Object cloe() { try { retur super.cloe(); catch (CloeNotSupportedExceptio e) { // O fluxo de cotrolo uca deverá passar por aqui. // Se por acaso passar, algo de muito errado acoteceu throw ew IteralError(); José Valete de Oliveira 14-23 Poit adopta política 1, código cliete Poit p = ew Poit(1, 2); Poit q = (Poit) p.cloe(); p.setx(0); System.out.pritl(p); System.out.pritl(q) José Valete de Oliveira 14-24 12
Fractio adopta política 1 /** @versio 2.0 */ class Fractio implemets Cloeable { // public Object cloe() { try { retur super.cloe(); catch (CloeNotSupportedExceptio e) { // O fluxo uca deverá passar por aqui. // Se por acaso passar, algo de muito errado acoteceu throw ew IteralError(); José Valete de Oliveira 14-25 Poit adopta política 1 // versão simples mas ERRADA! public Object cloe() { retur ew Poit(this.x, this.y); Class Pixel exteds Poit implemets Cloeable { // // Pixel p = ew Pixel(1, 2, R, G, B); Pixel impossible = (Pixel) p.cloe(); //ERRO. POR QUÊ? José Valete de Oliveira 14-26 13
Política 2: Suporta cloagem codicioalmete Para suportar cloagem codicioal, uma classe declara implemetar a iterface Cloeable e forece uma redefiição do método cloe() com visibilidade pública ode aida se declara o laçameto da exceção CloeNotSupportedExceptio. José Valete de Oliveira 14-27 Uma implemetação de IStack adopta política 2 /** @versio */ class AStack implemets IStack, Cloeable { private Object [] elemets; //... public Object cloe() throws CloeNotSupportedExceptio { AStack ewstack = (AStack) super.cloe(); ewstack.elemets = (Object []) elemets.cloe(); retur ewstack; José Valete de Oliveira 14-28 14
Uma classe pode adoptar 1 das seguites políticas de cloagem José Valete de Oliveira 14-29 Uma classe pode adoptar 1 das seguites políticas de cloagem José Valete de Oliveira 14-30 15
try, catch, fially agai try { expressão* catch ( exceptio_type idetificador ) { expressão* * [ fially { expressão* ] José Valete de Oliveira 14-31 Fially i actio public class OOff { static boolea O=true; public static void mai(strig[] args) { try { System.out.pritl("Iside the first try"); try { if (O) throw ew Exceptio(); System.out.pritl("Iside the secod try"); fially { System.err.pritl("I fially clause"); O = false; System.out.pritl("Igored i the presece of a exceptio."); catch(exceptio e) { e.pritstacktrace(); System.out.pritl("O: " + O); José Valete de Oliveira 14-32 16
Excepções defiidas pelo utilizador class MyExceptio exteds Exceptio { José Valete de Oliveira 14-33 Example: the graphic editor, agai The task is to develop a graphic editor which is able to maita ad operate 2D geometric figures. More specifically, the editor should be able of, give a square, geerate the tagetial ier circumferece. The square will be give by 2 suitable poits defiig its diagoals. For the sake of simplicity, the sides of the square are always parallel to the axis. Obviously, 2 poits defie a square whe the distace betwee coordiates i x are equals to distaces coordiates i y. A circumferece is represeted by its ceter (a poit) ad a radius (a double) José Valete de Oliveira 14-34 17
A istace of the problem José Valete de Oliveira 14-35 A possible class diagram José Valete de Oliveira 14-36 18
Excepções defiidas pelo utilizador class GeoExceptio exteds Exceptio { public GeoExceptio() {super(); public GeoExceptio(Strig s) {super(s); José Valete de Oliveira 14-37 Excepções defiidas pelo utilizador class GeoSquareExceptio exteds GeoExceptio { private Poto A, B; public GeoSquareExceptio() {super(); public GeoSquareExceptio(Strig s) {super(s); public GeoSquareExceptio(Strig s, Poto p, Poto q) { super(s); A = p; B=q; public geta() {retur A; public getb() {retur B; José Valete de Oliveira 14-38 19
Excepções defiidas pelo utilizador /** @versio 2.0 */ class Quadrado { private Poto A, B; public Quadrado(Poto p, Poto q) throws GeoSquareExceptio { if (! validapotos(p, q) ) throw ew GeoSquareExceptio( Ivalid:, p,q); A = p; B = q; //... José Valete de Oliveira 14-39 Excepções defiidas pelo utilizador try { Quadrado umquadrado = ew Quadrado(p, q); catch (GeoSquareExceptio e) { System.err.prit(e.getA() + e +e.getb() + ão defiem um quadrado ); José Valete de Oliveira 14-40 20
Assertios assert expressio [ : expressio]; José Valete de Oliveira 14-41 Check poit Somethig is wrog here. What it is? try { /* */ catch (Exceptio e) {/* */ catch (ArrayIdexOutOfBouds ae) {/* */ José Valete de Oliveira 14-42 21
Summary Itrodução Testes e Testes uitários Noção de Excepção A hierarquia Throwable e as excepções pré-defiidas do Java O laçameto de excepções e o sializador throw A clausula throws O maipulador de excepções catch e os blocos try e fially Excepções defiidas pelo programador Asserções Coclusões José Valete de Oliveira 14-43 22