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







sexta-feira, 6 de dezembro de 2013

Herança

Herdar é aproveitar código existente!

A Herança é um princípio da Programação Orientada a Objectos que permite que as classes compartilhem atributos e operações baseados em um relacionamento, geralmente generalização. A herança permite a criação de subclasses que herdam atributos e operações da classe pai. A herança é um conceito aplicado no momento de criação das classes. Ela é usada na intenção de evitar que classes que possuam atributos ou métodos semelhantes sejam repetidamente criados. Como exemplo pode-se observar as classes 'aluno' e 'professor', onde ambas possuem atributos como nome, endereço e telefone. Nesse caso pode-se criar uma nova classe chamada por exemplo, 'pessoa', que contenha as semelhanças entre as duas classes, fazendo com que aluno e professor herdem as características de pessoa, desta maneira pode-se dizer que aluno e professor são subclasses de pessoa.

* Quando uma classe AA herda de outra classe A:
- AA herda de A todos os dados e métodos que não são privados;
- AA pode definir novos dados e novos métodos;
- AA pode redefinir dados e métodos de A.
* Herdar é reaproveitar código já existente.

* Instruções de herança:

- extends: indica que uma classe vai herdar de outra;
* ex: public class AA extends A
* super: permite manipular dados e métodos da superclasse.
* ex: super.i = 2;
* // a classe AA está a modificar o atributo i da classe A
* Como é efectuado o acesso aos métodos e aos dados?

Objectos- O que é um objecto?

Na programação orientada a objectos (POO), a palavra objecto refere-se a uma instância de uma classe.

Objecto = dados + operações
Um objecto é caracterizado por:
Estado (atributos)
Comportamento (métodos)
Identidade única

Exemplos de objectos:
* Simulação de tráfego: peões, semáforos, ruas, automóveis,...
* Sistema gráfico: cores, círculos, linhas, polígonos, ...
* Sistema de gestão de horários: turmas, alunos, professores, restrições, salas, ...

Os objectos têm atributos
Uma linha tem origem e fim (dois pontos);
Os objectos podem fazer coisas (métodos)
Um círculo pode mudar de cor.

Criar um objecto em java?
tipo_do_objecto nome_do_objecto
ex: Coordenada c;

Objecto não é o mesmo que uma classe! Objecto é uma instância de uma classe (se não percebeste continua a ler..)
A definição de uma classe implica a especificação dos seus atributos (variáveis) e comportamento (métodos)
Um objecto é definido como uma instância particular de uma classe, com todas as variáveis e métodos definidos pela classe
A diferença entre um objecto e a sua classe é a diferença entre o Tareco e os Gatos
Convencionou-se, no Java, começar os nomes das classes com maiúsculas (MinhaClasse) e os objectos com minúsculas (meuObjecto)

C++ / JAVA (Diferenças)

Relativamente ao estilo de programação, as duas diferenças mais determinantes entre o Java e o C++ são as seguintes:
* Em Java a programação é, por natureza, baseada em objectos. Já o C++ suporta tanto programação baseada em valores como programação baseada em objectos, tendo o programador tem de decidir em cada momento sobre qual o estilo a seguir. Usar o estilo orientado pelos objectos em C++ implica declarar a maioria das variáveis e argumentos como apontadores e referências para que os objectos não percam a sua identidade.
* Um bom programa em Java tira exaustivamente partido da noção de interface. Em C++ esse conceito não existe. Pode ser simulado, mas isso não faz parte da "tradição" da programação em C++.
Em relação a outras linguagens de programação o Java tem as seguintes vantagens:
- Portabilidade
- Robustez
- Segurança
- Orientação a Objectos
- Dinamismo
- Alto Desempenho
Além destas vantagens, a linguagem Java está agora a incorporar o suporte a operações em Bases de Dados. O JDBC, que é uma biblioteca de classes para acesso a bases de dados, permite uma conexão remota a servidores SQL que possuam driver OBDC ou compatível.

Java Virtual Machine (JVM)

Java Virtual Machine(JVM) é um programa que carrega e executa os aplicativos Java, convertendo os bytecodes em código executável de máquina. A JVM é responsável pela gestão dos aplicativos a medida que são executados. Graças a JVM, os programas escritos em java podem funcionar em qualquer plataforma de hardware e software que possua uma versão da JVM, transformando assim essas aplicações independentes da plataforma que funcionam. Embaixo um diagrama simples:
E praticamente impossível criar programas com os fins maliciosos pois a JVM ao fazer passar os bytecodes pela JVM passa por vários requisitos de segurança lá presentes que impede a execução do código caso encontre irregularidades. Se um programa tentar aceder a áreas de memória restrita ou mesmo a recursos de hardware a JVM não aprova o código. O conceito de segurança no Java é baseado na SANDBOX (caixa de areia). Uma aplicação, seja qual for o ambiente (Windows, Unix, Mac OS, etc) possui um set de permissões do que pode ou não fazer. Cada ambiente possui sua SANDBOX específica com permissões e proibições. Tudo o que não for expressamente permitido é negado. O coração do esquema de segurança do SNADBOX é o Security Manager. Uma Aplicação Java tem a sua origem num ficheiro de texto. Após ter sido compilado, é criado um novo ficheiro, um ficheiro .java contem o texto, e este pode ser editado por qualquer editor de texto como por exemplo o Notepad. Apos a escrita do programa em Java é necessário compilar o ficheiro para o podermos executar. O compilador javac cria um novo ficheiro .java num ficheiro que o JVM entende criando um ficheiro com a extensão .class. Para executar o ficheiro será necessário utilizar o interpretador Java.