quinta-feira, 12 de dezembro de 2013

Excepções

O que é uma excepção?

Uma excepção (Exception) é um sinal gerado pelo interpretador do JAVA em tempo de execução (runtime) que é comunicado ao programa como sendo um erro recuperável;

Um erro em JAVA surge quando não existe recuperação possível levando a aplicação a terminar com a indicação do erro.

As excepções e erros são subclasses da classe java.lang.Throwable;
São as classes de topo das respectivas hierarquia

Fluxo de uma excepção

1. Quando um erro ocorre num método JAVA, o interpretador cria um objecto da classe exception e entrega-o ao runtime (chama-se fazer o throw da exception);
2. O objecto exception contém:
  2.1. O tipo de excepção
  2.2. O estado do programa quando o erro ocorreu
3. O runtime tem então de encontrar o código que deve ser aplicado quando ocorre um erro deste tipo;
4. O runtime procura para a frente, a partir do método corrente, até encontrar um tratador da excepção;

Manipulação de excepções

A manipulação de excepções no JAVA é efectuada através do uso de cinco palavras reservadas:
* try: precede o código crítico;
* catch: “apanha” uma excepção;
* throw: despoleta uma excepção;
  * throws: indica que um método despoleta uma excepção;
  * finally: código sempre executado.

Estrutura de um try-catch:

try {
//bloco de código
} catch(ExceptionType1 e1) {
//código para gerir a excepção de tipo ExceptionType1
} catch(ExceptionType2 e2) {
//código para gerir a excepção de tipo ExceptionType2
} …
finally{
//código para a finalização
}

Sobre o finally

* É uma zona de código de “limpeza”;
* Evita repetição de código de “limpeza”;
* É executado quando:
* Tudo funciona bem;
* Uma excepção (não) é “apanhada” por um catch;
* Não é obrigatório colocar.

Criação de excepções

Para despoletar excepções de situações diversas pode-se 
usar a classe Exception.


Ex: 
throw new Exception(“Erro na leitura do ficheiro”);

Além das excepções do JAVA existe a possibilidade do 

programador criar as suas.
Ex:
public class ExceptionFicheiro extends Exception{
public ExceptionFicheiro() { super()};
public ExceptionFicheiro(String msg) { super(msg);}
}

Uma excepção é uma classe “normal”!

Vantagens das excepções

* Separar código normal do código de gestão de erros;
* Permitir a propagação de erros pela aplicação;
* Re-aproveitar excepções já existentes;

* Agrupar erros por tipos.


Exemplo em codigo Java de uma  aplicação que tem por objectivo a gestão de quartos de um hotel.
Onde é Utilizado algumas excepções..

Para este projecto criei 2 package o Room e o rooms.exceptions (onde coloquei as Excepções)
No pakage Room...

/*
 * class Room
 */
package rooms;


public class Room {
    private int number;
    private boolean occupied;
    
    public Room(int number) {
        this.number=number;
        this.occupied=false;
    }

    public int getNumber() {
        return number;
    }
    public boolean isOccupied() {
        return occupied;
    }

       public void setOccupied(boolean occupied) {
        this.occupied = occupied;
    }
    
    public String toString() {
        
        return "Room number: " + number + ", Occupied: " + occupied;
    }

}


/*
 *class Hotel
 */
package rooms;

import java.util.ArrayList;
import rooms.exceptions.HotelException;
import rooms.exceptions.RoomNotFoundException;
import rooms.exceptions.RoomUnavailableException;
import rooms.exceptions.SizeException;


public class Hotel extends ArrayList<Room>{
    private int roomNumbers;
    private String hotelName;
    
    public Hotel() {
        this("N/A", 10);
    }
    
    public Hotel(String name, int size){
        super();
        this.hotelName=name;
        this.roomNumbers=size;
    }
    
    public void add(Room ... rooms) throws SizeException {
        for (Room e : rooms) {
            if (this.size() < roomNumbers)
                this.add(e);
            else throw new SizeException();
        }
    }
    
    
    public Room getRoom(int roomNumber) throws RoomNotFoundException {
        for (int i=0; i<roomNumbers; i++)
            if (((Room)this.get(i)).getNumber()==roomNumber) return this.get(i);
        
        throw new RoomNotFoundException("Room: " + roomNumber + " not found.");
    }
    
    public void reservaRoom(int roomNumber) throws HotelException {
        Room r = getRoom(roomNumber);
        if (r.isOccupied()) throw new RoomUnavailableException("Room: " + roomNumber + " occupied.");
        else r.setOccupied(true);
    }
    
    public void cancelReservation(int roomNumber) throws RoomNotFoundException  {
        Room r = getRoom(roomNumber);
        r.setOccupied(false);
    }
    
    public void checkOut(int roomNumber) throws RoomNotFoundException {
        cancelReservation(roomNumber);
    }
    
    public String toString() {
        String exit="Hotel " + hotelName + ", Capacity: " + roomNumbers + "\n";
        
        for (int i=0; i<roomNumbers; i++)
            exit+= ((Room)this.get(i)).toString() + "\n";
        
        return exit;
    }
}


/*
 *  class HotelMain
 */
package rooms;

import rooms.exceptions.HotelException;
import rooms.exceptions.RoomNotFoundException;
import rooms.exceptions.SizeException;


public class HotelMain {


    public static void main(String[] args) {
        int hotelSize=5;
        
        Hotel h=new Hotel("Alg@rve", hotelSize);
        
        
        for (int i=0; i<hotelSize - 2; i++)
            h.add(new Room(100+i));
        
        Room r=new Room(103);
        Room r1=new Room(104);
        try {
            h.add(r, r1);
        }
        catch(SizeException s) {
            System.out.println(s);
        }
        
        System.out.println(h);
                
        try {
            // vamos provocar uma excepção: substituir 100 por 110
            h.reservaRoom(100);
            
            System.out.println(h);
            
            h.reservaRoom(102);
            // vamos reservar o mesmo quarto: qual a excepção despoletada?
            // h.reservaRoom(102);
            
            System.out.println(h);
            
            h.cancelReservation(100);
            h.checkOut(102);
        }
        catch(RoomNotFoundException re) {
            System.out.println(re);
        }
        catch(HotelException e) {
            System.out.println(e);
        }
        
        System.out.println(h);
    }

}

No pakage  rooms.exceptions...

/*
 * class HotelException
 */
package rooms.exceptions;


public class HotelException extends Exception {
    public HotelException() {
        super();
    }
    
    public HotelException(String msg) {
        super(msg);
    }
}

/*
 *class RoomException
 */
package rooms.exceptions;


public class RoomException extends HotelException {
    public RoomException() {
        super();
    }
    
    public RoomException(String msg) {
        super(msg);
    }

}

/*
 * Class RoomNotFoundException
 */
package rooms.exceptions;


public class RoomNotFoundException extends RoomException {
    
    public RoomNotFoundException() {
        super();
    }
    
    public RoomNotFoundException(String msg) {
        super(msg);
    }

}

/*
 * class RoomUnavailableException 
 */
package rooms.exceptions;


public class RoomUnavailableException extends RoomException {
    
    public RoomUnavailableException() {
        super();
    }
    
    public RoomUnavailableException(String msg) {
        super(msg);
    }

}

/*
 * class SizeException 
 */
package rooms.exceptions;


public class SizeException extends HotelException {
    public SizeException() {
        super("Invalid size.");
    }    

}

Download project 
Download by speedyshare







Sem comentários:

Enviar um comentário