Você está na página 1de 69

16

CURSO DE POO COM JAVA


Agregao, Listas e Mapeamentos

PROF. MARCOS VINICIUS


E-mail: marcos.engsoft@gmail.com

AGREGAO, LISTAS E MAPEAMENTOS


Agregao

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.

AGREGAO, LISTAS E MAPEAMENTOS


Agregao (continuao) Um objeto agregado criado a partir de outros objetos constituintes, que so suas partes. Objetos em Java no podem conter outros objetos. Eles podem ter referncias para outros objetos.

Java suporta agregao de objetos por referncia!

AGREGAO, LISTAS E MAPEAMENTOS


Representao UML de agregao
Turma -nome -numEstudantes -estudantes Estudante -nome -matrcula -sexo

Turma uma Agregao de Estudantes.


Exemplo de cdigo de uma Agregao: public class Turma { String nome; int numEstudantes; Estudante estudantes[]; ... }

AGREGAO, LISTAS E MAPEAMENTOS


Arrays de objetos Da mesma forma que podemos ter arrays de tipos primitivos de dados, podemos ter arrays de objetos. Assim, arrays podem representar grupo de dados do mesmo tipo primitivo, ou ainda, da mesma classe. Declarando arrays de objetos e tipos primitivos:

double notas[]; Estudante estudantes[];


Quando um array criado, todos os seus elementos so automaticamente inicializados com valores padro do tipo primitivo, ou para null, se forem objetos.

AGREGAO, LISTAS E MAPEAMENTOS


Arrays de objetos (continuao) Use new para criar novos arrays de objetos, assim como se fazia para tipos primitivos: double notas [] = new double[4]; Estudante estudantes[] = new Estudante[5]; Representao em memria:
notas
0 1 2

estudantes
3 0 1 2 3 4

0.0

0.0

0.0

0.0

null

null

null

null

null

AGREGAO, LISTAS E MAPEAMENTOS


Manipulando arrays de objetos notas[0] = 8.5; estudantes[1] = new Estudante(Maria); estudantes[1].setMatricula(120);
notas
0 1 2

estudantes
3 0 1 2 3 4

8.5

0.0

0.0

0.0

null

null

null

null

nome = Maria matricula = 120 sexo =

AGREGAO, LISTAS E MAPEAMENTOS


Exemplo de manipulao de arrays de objetos public class Turma { Estudante estudantes[] = new Estudante[5]; String nome; int numEstudantes = 0;

public void matricular (Estudante e) { estudantes[numEstudantes] = e; numEstudantes++; } } ... Estudante novoEst = new Estudante(Maria); Turma turma1 = new Turma(POO); turma1.matricular( novoEst ); ...

AGREGAO, LISTAS E MAPEAMENTOS


Visualizando graficamente
turma
nome = POO numEstudantes = 1 estudantes

novoEst

null
nome = Maria matricula = 0 sexo =

null

null

null

AGREGAO, LISTAS E MAPEAMENTOS


Observaes importantes!

AGREGAO, LISTAS E MAPEAMENTOS


Colees, listas e mapeamentos Uma coleo (collection) permite que um grupo de objetos seja tratado como uma unidade. Objetos arbitrrios podem ser armazenados, recuperados e manipulados como elementos de colees. Colees esto disponveis no pacote java.util e podem aparecer na forma de listas e conjuntos.

AGREGAO, LISTAS E MAPEAMENTOS


Colees, listas e mapeamentos (continuao) A hierarquia de classes e interfaces que trabalham com colees apresentada abaixo.

AGREGAO, LISTAS E MAPEAMENTOS


Colees, listas e mapeamentos (continuao) Descrio das Interfaces que representam Colees, Listas e Mapeamentos:
Interface Collection Set List Map Descrio Uma interface bsica que define as operaes para trabalhar com colees de objetos. Representam conjuntos que mantm elementos nicos. Representam listas que mantm seus elementos numa List (sequncia), isto , os elementos esto em ordem. Representam mapeamentos de chaves para valores.

AGREGAO, LISTAS E MAPEAMENTOS


Colees, listas e mapeamentos (continuao) As estruturas de listas e mapeamentos mais utilizadas so:
ArrayList Vector HashMap HashTable Arrays dinmicos. Arrays dinmicos sincronizados (thread-safe), ou seja, chamadas concorrentes a um objeto no comprometero sua integridade.

Tabelas de pares chave-valor. Tabelas de pares chave-valor sincronizadas (threadsafe), ou seja, chamadas concorrentes a um objeto no comprometero sua integridade.

AGREGAO, LISTAS E MAPEAMENTOS


Listas Listas so colees que mantm seus elementos em ordem (tambm chamado de sequncia), e permitem elementos duplicados. Em uma lista no vazia, o primeiro elemento tem ndice 0 e o ltimo size()-1. Uma operao sob um ndice que no existe gera uma IndexOutOfBoundsException.

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.

AGREGAO, LISTAS E MAPEAMENTOS


Visualizando graficamente uma lista
lista 0 1 2 3 size()-1 = 4

objetos obj

Object obj = lista.get(3);

AGREGAO, LISTAS E MAPEAMENTOS


Principais operaes para listas
int size(); boolean isEmpty(); boolean add(Object element); Retorna o tamanho da lista. Retorna true se a lista estiver vazia. Adiciona um objeto ao final da lista. Retorna o elemento no ndice especificado. Substitui o elemento no ndice especificado com o parmetro passado. Verifica se o objeto passado como parmetro membro da coleo. Retorna o ndice da primeira ocorrncia do elemento especificado na lista, se o elemento existir, caso contrrio retorna -1. Remove todos os elementos da list. Remove o elemento no ndice especificado, reduzindo o tamanho da lista.

Object get(int index);


Object set(int index, Object element); boolean contains(Object element);

int indexOf(Object o); void clear(); Object remove(int index);

AGREGAO, LISTAS E MAPEAMENTOS


Inserindo elementos no ArrayList import java.util.*; public class TesteArrayList { public static void main (String args[]) { ArrayList al = new ArrayList(); al.add( POO-Java ); al.add( new Integer(10) ); al.add( new ContaCorrente() ); al.add( new Professor(Marcos) ); al.add( new Estudante(Maria) ); print ( al ); } ...

AGREGAO, LISTAS E MAPEAMENTOS


Percorrendo um ArrayList ... public void print( ArrayList a ) { for( int i = 0; i < a.size(); i++ ) { System.out.println( a.get(i) ); } } }

AGREGAO, LISTAS E MAPEAMENTOS


Outra forma de percorrer um ArrayList H uma maneira mais elegante de percorrer uma lista. A interface ListIterator um iterator customizado (personalizado) para listas.

Permite percorrer a lista em ambas as direes.


interface ListIterator { boolean hasNext(); boolean hasPrevious(); Object next(); Object previous(); int nextIndex(); int previousIndex(); }

AGREGAO, LISTAS E MAPEAMENTOS


Percorrendo um ArrayList com Iterator import java.util.*; public class TesteArrayList3 { public static void main(String args[]) { List myList = new ArrayList(); myList.add(1); myList.add(2); myList.add(3); for (int i=0; i < myList.size(); i++) { System.out.println( myList.get(i) ); } ListIterator it = myList.listIterator(); while ( it.hasNext() ) { System.out.println( it.next() ); } }}

AGREGAO, LISTAS E MAPEAMENTOS


ArrayList genrico O mtodo get( int index ) retorna um Object, portanto, pode ser necessrio realizar converses (casting) se o tipo for diferente de Object. Recuperando elementos do ArrayList e realizando casting.

public class TesteArrayList4 { public void print( ArrayList al ) { for( int i = 0; i < al.size(); i++ ) { Estudante e = (Estudante)al.get(i); e.exibir(); } }}

AGREGAO, LISTAS E MAPEAMENTOS


ArrayList de tipo especfico A verso 1.5 do Java introduziu o conceito de listas de tipos especficos. Assim, o casting anterior no mais necessrio. Para isso, use parnteses angulares ( <Tipo> ) para definir o tipo de sua lista. public class TesteArrayList { public void static main( String args [] ) { ArrayList<Integer> li = new ArrayList<Integer>(); li.add( new Integer(1) ); li.add( 2 ); for (int i=0; i < li.size(); i++) { int n = li.get(i); System.out.println( n ); } } }

AGREGAO, LISTAS E MAPEAMENTOS


Vamos treinar: exerccios propostos
40) Implementar uma classe Turma com as seguintes caractersticas: Nome da turma; Um array de estudantes de tamanho 10; Um inteiro numEstundates para contar os estudantes matriculados na turma; Inclua os seguintes mtodos: void matricular (Estudante e) inclui estudante na turma; void listar mostra os dados de todos os estudantes da turma; Estudante pesquisar (int matricula) procura no array o estudante de matrcula igual ao parmetro passado e o retorna; void trancar (int matricula) exclui estudante da turma; void trancar (Estudante e) exclui estudante da turma

AGREGAO, LISTAS E MAPEAMENTOS


Vamos treinar: exerccios propostos
41) Implementar um programa TesteTurma com as seguintes funcionalidades: cria trs estudantes diferentes (estudante, tutor e estagirio); matricula os trs estudantes; lista os trs estudantes; pesquisar um dos estudantes e exibir seus dados; excluir estudantes usando as duas maneiras diferentes. 42) Crie uma classe TurmaArrayList para funcionar com estrutura de dados redimensionvel dinmicamente (ArrayList, por exemplo) ao invs de array. necessrio modificar todos os mtodos. O mtodo exibir deve usar iterator para varrer a lista e get() para pegar um elemento na lista. Os mtodos excluir devem varrer o ArrayList usando loops tradicionais (for). Observe que o programa TesteTurma pode ser utilizado com a nova definio da classe TurmaArrayList sem necessidade de ser alterada

AGREGAO, LISTAS E MAPEAMENTOS


Mapeamentos

Um Map (mapeamento) define mapeamentos de chaves para valores.


Um Map no permite chaves duplicadas, ou seja, as chaves so nicas. Cada chave mapeia no mximo um valor. HashMap um dos mapeamentos mais utilizados.

Se voc precisa acessar a lista sequencialmente, use um ArrayList.


Se voc precisa acessar a lista aleatoriamente, utilizando uma chave de busca, use HashMap. Perceba que tanto chave como valor devem ser objetos (Object).

AGREGAO, LISTAS E MAPEAMENTOS


Visualizando mapeamentos graficamente

A
chave valor

obj

B Objetos chaves C Objetos valores

D hashMap

Object obj = hashMap.get(B);

AGREGAO, LISTAS E MAPEAMENTOS


Principais operaes para mapeamentos
int size(); boolean isEmpty(); boolean put(Object key, Objetct value); Retorna o tamanho do mapeamento. Retorna true se o mapeamento estiver vazio. Insere um mapeamento, isto , um par <key, value>, tambm chamado de entrada. Retorna o valor para o qual a chave (key) mapeada ou null se nenhum mapeamento for encontrado. Remove um objeto do mapeamento Verifica se a chave existe. Verifica se o valor existe. Remove todos os elementos do mapeamento.

Object get(Object key);


Object remove(Object key); boolean containsKey(Object o); boolean containsValue(Object o); void clear();

AGREGAO, LISTAS E MAPEAMENTOS


Inserindo elementos no HashMap import java.util.*; public class TesteHashMap { public static void main( String args[] ) { HashMap hm = new HashMap(); Estudante e = new Estudante( Maria ); EstudanteMonitor em = new EstudanteMonitor( Joo ); hm.put( 1, e ); hm.put( 2, em ); ...

AGREGAO, LISTAS E MAPEAMENTOS


Buscando elementos no HashMap ... // Buscando o estudante 1 Estudante e1 = (Estudante)hm.get( 1 ); // Buscando o estudante 2 EstudanteMonitor e2 = (EstudanteMonitor)hm.get( 2 ); e1.exibir(); e2.exibir(); } }

AGREGAO, LISTAS E MAPEAMENTOS


HashMap de tipos especficos A verso 1.5 do Java tambm possui HashMaps de tipos especficos:

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?

AGREGAO, LISTAS E MAPEAMENTOS


Vamos treinar: exerccios propostos
44) Escrever uma classe TesteHashMap que cria um map de tipos especficos que tem como chaves nmeros inteiros (Integer) representando as matrculas dos estudantes, e como valor os respectivos objetos da classe Estudante. Crie trs instncias de estudante e os inclua no map. Depois, consulte o map utilizando a matrcula de algum estudante, exibindo os dados do estudante consultado.

17

CURSO DE POO COM JAVA


Excees

PROF. MARCOS VINICIUS


E-mail: marcos.engsoft@gmail.com

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.

void processarNota(e, numProva, nota) { if ( !e.atribuirNota(numProva, nota) ) { System.out.println(Nota Invalida!); }

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();

Dispara a instncia (exceo) recm-criada

Cria uma instncia da classe NovaInvalidaException

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!); }

Dois blocos catch, a mais especfica vem primeiro

catch (Exception e) { System.out.println(Erro desconhecido!); } finally { System.out.println(Sempre passa aqui!); }

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.

Vamos conhecer um pouco da hierarquia de Excees do Java.

EXCEES
Hierarquia de excees
Object

Condies excepcionais checadas pelo compilador (eventos recuperveis)

Throwable

Erros no checados pelo compilador (eventos irrecuperveis)

Excees no checadas pelo compilador (erros de lgica)

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.

Os principais mtodos para excees:


Exception() Exception( String msg ) String getMessage() void printStackTrace() Cria uma exceo. Cria uma exceo com a mensagem de erro msg.

Retorna a mensagem especfica daquela exceo.


Imprime a pilha de execuo no momento que ocorreu o erro.

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.