Professional Documents
Culture Documents
Alm da herana, existe outro mecanismo fundamental de reuso de cdigo, chamado Agregao. Herana define uma relao do tipo um (ou relao superclasse-subclasse), enquanto agregao define uma relao do tipo tem um (ou relao todo-parte).
Exemplos: Uma turma composta de estudantes; Uma empresa composta de departamentos; Um aparelho composto de peas. Sempre que tal situao acontecer, pode-se aplicar o conceito da Agregao.
estudantes
3 0 1 2 3 4
0.0
0.0
0.0
0.0
null
null
null
null
null
estudantes
3 0 1 2 3 4
8.5
0.0
0.0
0.0
null
null
null
null
public void matricular (Estudante e) { estudantes[numEstudantes] = e; numEstudantes++; } } ... Estudante novoEst = new Estudante(Maria); Turma turma1 = new Turma(POO); turma1.matricular( novoEst ); ...
novoEst
null
nome = Maria matricula = 0 sexo =
null
null
null
Tabelas de pares chave-valor. Tabelas de pares chave-valor sincronizadas (threadsafe), ou seja, chamadas concorrentes a um objeto no comprometero sua integridade.
Diferente dos arrays tradicionais do Java, um Lista no tem um tipo determinado, ou seja, o primeiro elemento pode ser de um tipo diferente do segundo elemento.
Porm, todos os elementos devem ser objetos tipos primitivos no so permitidos.
objetos obj
public class TesteArrayList4 { public void print( ArrayList al ) { for( int i = 0; i < al.size(); i++ ) { Estudante e = (Estudante)al.get(i); e.exibir(); } }}
A
chave valor
obj
D hashMap
public class TesteArrayList { public void static main( String args [] ) { HashMap<Integer, String> hm = new HashMap<Integer, String>(); hm.put( 2, "Maria" ); hm.put( 7, "Pedro" ); hm.put( 5, "Madalena" ); String s = hm.get(7); System.out.println( s ); } }
DVIDAS?
17
EXCEES
Introduo Na execuo de um programa, vrias situaes so passveis de gerar erros. As operaes podem gerar diferentes tipos de erros devido a: Ambiente de execuo Ex: Acesso a arquivo, acesso rede, falta de memria ... Erros de programao Ex: Dividir por zero, acessar uma array fora dos limites de seu tamanho ... Condies de negcio do programa Ex: Retirar dinheiro de uma conta sem saldo, diminuir o salrio de um funcionrio, atribuir uma nota invlida a um aluno.
EXCEES
Introduo (continuao) Na maioria das linguagens de programao, o tratamento de erros feito geralmente atravs de testes condicionais, usando if por exemplo, com auxlio de variveis booleanas. Vamos relembrar o tratamento de situaes onde poderiam ocorrer erros durante a atribuio da nota de um estudante. void atribuirNota(int numProva, double nota) { if ( nota >= 0 && nota <= 10.0 ) { notas[numProva-1] = nota; } }
EXCEES
Introduo (continuao) Se tentarmos atribuir uma nota invlida a uma prova, a atribuio no ser realizada. Caso no se consiga efetuar a atribuio, como o mtodo que chamou atribuirNota ficar sabendo da no realizao da operao? void processarNota(e, numProva, nota) { e.atribuirNota(numProva, nota); } Vamos retornar, ento, um valor booleano para indicar o sucesso ou no da operao.
EXCEES
Introduo (continuao) boolean atribuirNota(int numProva, double nota){ if ( nota >= 0 && nota <= 10.0 ) { notas[numProva-1] = nota; return true; } else return false; } No nosso mtodo processarNota, podemos agora tratar esse valor booleano.
EXCEES
Introduo (continuao) E se o mtodo processarNota anterior no tratar o erro? Para o sistema ser robusto, seria interessante ter uma maneira de forar os mtodos que chamam o mtodo atribuirNota a tratarem o erro. Sistemas robustos requerem uma forma mais precisa para tratamento de erros. Alm disso, testes manuais excessivos podem gerar cdigo incompreensvel. Java prov um mecanismo diferenciado, chamado de Excees (Exceptions), que estrutura o tratamento de erros e garante robustez aos sistemas.
EXCEES
Cenrio tpico para uso de excees tente fazer algo faa alguma coisa 1; faa alguma coisa 2; faa alguma coisa 3; capture se ocorrer uma exceo tipo 1: faa um tratamento especial para exceo do tipo 1; capture se ocorrer uma exceo tipo 2: faa um tratamento especial para exceo do tipo 2; ... finalmente: faa algo final (sempre);
EXCEES
Criando uma classe de exceo Exceo em Java um sinal que indica a ocorrncia de alguma condio excepcional. O compilador Java obriga o usurio da classe a tratar os possveis erros que um mtodo pode gerar (linguagem fortemente tipada). A primeira coisa a fazer definir uma classe que representa a exceo para nosso exemplo. Toda nova exceo deve herdar da classe Exception. public class NotaInvalidaException extends Exception { } H um padro para nomes de Excees, onde os nomes terminam sempre com a palavra Exception.
EXCEES
A clusula throws Agora devemos definir os mtodos que podem disparar essa exceo. Isso feito usando a clusula throws (dispara).
void atribuirNota(int numProva, double nota) throws NotaInvalidaException { if ( nota >= 0 && nota <= 10.0 ) { notas[numProva-1] = nota; } }
Assim, dizemos que o mtodo atribuirNota pode disparar uma exceo, possibilidade essa que deve ser convenientemente tratada pelos mtodos que chamam o mtodo atribuirNota.
EXCEES
A sentena throw O prximo passo disparar a exceo dentro do mtodo atribuirNota, quando ela ocorrer. Isso feito usando a sentena throw (disparar).
void atribuirNota(int numProva, double nota) throws NotaInvalidaException { if ( nota >= 0 && nota <= 10.0 ) { notas[numProva-1] = nota; } else throw new NotaInvalidaException(); }
Perceba a diferena: throws: indica que o mtodo pode disparar uma exceo throw: dispara a exceo.
EXCEES
A sentena throw (continuao) Como Excees so classes, antes de disparar uma exceo, temos que criar o objeto. Eis o porqu da construo abaixo: throw new NotaInvalidaException();
Assim fazendo, todo mtodo que chama o mtodo atribuirNota deve tratar a possibilidade de o mtodo atribuirNota gerar uma exceo.
EXCEES
O bloco try catch Fazemos isso usando os blocos try-catch. void processarNota() { try { Estudante e = new Estudante(); e.atribuirNota(1, 11.0); } catch (NotaInvalidaException e) { System.out.println(Erro na atribuio de nota!); } }
EXCEES
Entendendo o bloco try catch finally O bloco try-catch possui ainda uma terceira parte opcional chamada finally. O bloco finally, quando existe, sempre executado, ocorrendo ou no uma exceo. O bloco finally geralmente usado para fechar conexes com banco de dados, resetar variveis, enfim, aes que devem ser tomadas caso erros ocorram ou no. try { Estudante e = new Estudante(); e.atribuirNota(1, 11.0); } catch (NotaInvalidaException e) { System.out.println(Erro na atribuio nota!); } finally { sempre System.out.println(Sempre passa aqui!); executado! }
EXCEES
Disparando vrias excees Todas as excees disparadas por um mtodo tm que ser listadas na assinatura do mtodo. void atribuirNota(int numProva, double nota) throws NotaInvalidaException, ProvaInvalidaException { if ( nota < 0.0 || nota > 10.0 ) throw new NotaInvalidaException(); else if ( numProva < 1 || numProva > 4 ) throw new ProvaInvalidaException(); else notas[numProva-1] = nota; }
EXCEES
Entendendo o bloco try catch finally completo try { Estudante e = new Estudante(); e.atribuirNota(1, 11.0); } catch (NotaInvalidaException e) { System.out.println(Nota invalida); } catch (ProvaInvalidaException e) { System.out.println(Prova invalida!); } finally { System.out.println(Sempre passa aqui!); }
EXCEES
Entendendo mais o bloco try catch Java permite vrios blocos catch, cada um tratando uma exceo especfica, ou nenhum. No caso de tratar vrias excees usando vrios blocos catch, as excees mais especficas devem vir antes das mais genricas, pois a primeira exceo que o sistema conseguir casar tem seu bloco catch executado.
Exception
A mais especfica deve vir antes!
NotaInvalidaException
EXCEES
Entendendo mais o bloco try catch finally completo try { Estudante e = new Estudante(); e.atribuirNota(1, 11.0); } catch (NotaInvalidaException e) { System.out.println(Erro na atribuio de nota!); }
EXCEES
Funcionamento do bloco try catch - finally Uma vez que ocorreu uma exceo dentro de um bloco try, o interpretador Java faz uma espcie de switch, comparando o objeto exceo gerado com os tipos de excees existentes nas clusulas catch at encontrar a primeira que se encaixe com seu tipo. Feito isso, o sistema executa o bloco catch escolhido. Se houver bloco finally, ele sempre ser executado. Blocos try podem ser aninhados.
EXCEES
Funcionamento do bloco try catch finally (continuao)
EXCEES
Mais sobre o bloco try catch finally Sempre que ocorre um erro em Java, um objeto do tipo Exception ou de uma de suas subclasses gerado. Esse objeto pode ser capturado e devidamente tratado usando a construo try-catch-finally.
EXCEES
Tratando excees Existem duas forma de tratar uma exceo localmente: 1. Capturando-a dentro de um bloco try-catch-finally: void processarNota() { try { Estudante e = new Estudante(); e.atribuirNota(1, 11.0); } catch (NotaInvalidaException e) { System.out.println(Erro na atribuio de nota!); } }
EXCEES
Tratando excees (continuao) 2. Declarando que ser tratada por quem chama o mtodo. void atribuirNota(int numProva, double nota) throws NotaInvalidaException Quem chamar o { mtodo atribuirNota if ( nota >= 0 && nota <= 10.0 ) deve tratar essa exceo ou repass-la { para ser tratada por notas[numProva-1] = nota; quem o chamou, e } assim por diante, at else chegar ao mtodo throw new NotaInvalidaException(); main e abortar o programa, se nunca }
for devidamente tratada.
EXCEES
Tratando excees (continuao) Tratando o erro no mesmo lugar em que foi gerado:
void atribuirNota(int numProva, double nota) { try { if ( nota >= 0 && nota <= 10.0 ) { notas[numProva-1] = nota; } else throw new NotaInvalidaException(); } catch(NotaInvalidaException e) { ... } }
EXCEES
Excees nativas Java j disponibiliza uma sria de excees. Portanto, antes de criar uma nova classe de exceo, interessante verificar se j existe uma exceo igual ou similar desejada. Observe o cdigo abaixo: class TesteExcecao { public static void main(String argv[]) { int d1,d2; d1 = 10; d2 = 0; System.out.println(d1/d2); } }
EXCEES
Excees nativas (continuao) O cdigo anterior vai resultar no seguinte erro quando executado:
Exception in thread "main" java.lang.ArithmeticException: / by zero at TesteExececao.main(TesteExececao.java:6) Press any key to continue...
Isso ocorre porque tentou-se dividir um inteiro por zero, indicada na mensagem do sistema por ArithmeticException. A exceo ArithmeticException j est disponvel na linguagem Java, assim com uma srie de outras excees.
EXCEES
Hierarquia de excees
Object
Throwable
Exception
IOException FileNotFoundException MinhaExcecao SuaExcecao ...
Error
OutOfMemoryError InternalError VirtualMachineError UnknownError ...
RuntimeException
ClassCastException NullPointException NumberFormatException ArrayIndexOutBoundsException ...
EXCEES
A classe Exception A classe Exception representa as excees que podem ser disparadas, capturadas e tratados pelos programas. Cada exceo especfica subclasse de Exception e contm informaes sobre o problema ocorrido.
EXCEES
Usando mtodos de excees class TesteExcecao { public static void main(String argv[]) { try { int d1,d2; d1 = 10; d2 = 0; System.out.println(d1/d2); } catch (ArithmeticException e) { System.out.println ( erro: + e.getMessage() ); e.printStackTrace(); } } erro:/ by zero java.lang.ArithmeticException: / by zero }
at TesteExcecao.main(TesteExcecao.java:7)
EXCEES
Armazenando informaes nas excees
Como foi que esse erro aconteceu?
Novos tipos de excees podem ser criados estendendo-se a classe Exception ou suas subclasses.
As novas excees podem disponibilizar informaes sobre o erro ocorrido. Excees so classes, portanto, podem definir variveis e mtodos, permitindo prover assim, mais informao sobre a causa e a soluo para o problema ocorrido.
EXCEES
Armazenando informaes nas excees (continuao) Vamos aperfeioar a exceo NotaInvalidaException acrescentando informaes a ela. public class NotaInvalidaException extends Exception { private double notaInvalida; public double getNotaInvalida() { return notaInvalida; } public NotaInvalidaException( double nota ){ super(Nota Invalida); notaInvalida = nota; } }
EXCEES
Armazenando informaes nas excees (continuao) O mtodo que vai tratar a exceo pode fazer chamada aos mtodos disponibilizados pela exceo como se estivesse usando um objeto comum.
void processarNota() { try { Estudante e = new Estudante(); e.atribuirNota(1, 11.0); } catch (NotaInvalidaException e) { System.out.println( e.getMessage() ); System.out.println(A nota invlida +e.getNotaInvalida()); } }
EXCEES
Armazenando informaes nas excees (continuao) Agora vamos usar nossa classe aperfeioada, criando uma exceo passando como parmetro a nota que provocou o erro. Essa informao vai ficar guardada no prprio objeto exceo gerado. void atribuirNota(int numProva, double nota) throws NotaInvalidaException { if ( nota >= 0 && nota <= 10.0 ) { notas[numProva-1] = nota; } else throw new NotaInvalidaException( nota ); }
EXCEES
Implementando excees Para trabalhar com excees, o seguinte roteiro pode ser seguido: 1. Definir os novos tipos de exceo, se necessrio; 2. Identificar os mtodos que podem gerar excees; 3. Disparar excees de acordo com cada situao; 4. Prover cdigo para tratar a exceo, caso venha a ocorrer.
DVIDAS?
EXCEES
Vamos treinar: exerccios propostos
45) Implementar a classe de exceo NotaInvalidaException armazenando tambm o nmero da prova.
46) Alterar o mtodo atribuirNota para disparar uma exceo caso seja tentado atribuir uma nota invlida.
47) Alterar o programa TesteEstudante para criar um estudante e tentar atribuir notas a ele, oferecendo um cdigo seguro atravs do bloco try-catch-finally. 48) Criar uma nova exceo chamada ProvaInexistenteException, que valida se o nmero da prova que se deseja atribuir est dentro dos limites do array de notas.
49) Alterar o mtodo atribuirNota para tambm disparar uma exceo caso seja tentado atribuir uma nota a uma prova inexistente.
50) Alterar o programa TesteEstudate para proteger o cdigo contra erros de prova inexistente.
EXCEES
Vamos treinar: exerccios propostos
51) Implementar para a classe Turma o tratamento de erro das seguintes situaes: Criar uma turma, mas o nome veio nulo; Matricular o estudante, mas o estudante veio nulo; Pesquisar estudante, mas no existe estudante com a matrcula passada como argumento; Trancar estudante, mas no existe estudante com a matrcula igual quela passada como argumento; Trancar estudante, mas no existe estudante igual quele passado como argumento. 52) Identifique outras situaes na classe Estudante, suas subclasses e na classe Turma onde se poderia usar excees.