Laboratório de Programação
Dr. Italo Santiago Vega Curso de Graduação Ciência da Computação Pontifícia Universidade de São Paulo
Copyright © 1998-2004, Italo S. Vega
Semana Data Tópico
1 2004-02-18 "Apresentação: computação e programas. Bibliografia. Avali- ação."
2 2004-02-25 "RECESSO: Carnaval."
3 2004-03-03 "Organização de informações. Ambiente Java."
4 2004-03-10 "BlueJ: familiarização e computação com objetos."
5 2004-03-17 "Variáveis; valores; expressões."
6 2004-03-24 "Representação de computações. Seleção simples (teoria)."
7 2004-03-31 "Seleção dupla."
8 2004-04-07 "Seleção múltipla."
9 2004-04-14 "Iteração com contador."
10 2004-04-21 "RECESSO: Dia de Tiradentes."
11 2004-04-28 "Iteração com sentinela."
12 2004-05-05 "Comunicação com o usuário."
13 2004-05-12 "Estrutura de dados: array."
I 14 2004-05-19 "Mecanismo de Exceções em Java"
15 2004-05-26
16 2004-06-02
17 2004-06-09
18 2004-06-16
19 2004-06-23
20 2004-06-30
Conteúdo
1 Erros, Faltas e Falhas 4
2 Tratamento de Exceções em Java 10
2.1 Hierarquia de Exceções . . . 22 2.2 Lançamento e Captura de Exceções . . . 24
Objetivos • Mostrar o mecanismo de exceções do ambiente Java.
1 Erros, Faltas e Falhas
Erros Erros introduzem faltas nos programas que, ao serem executadas, provocam falhas de execução. Erros podem e devem ser corrigidos.
Exemplo 14.1 Situações comuns de erros que geram faltas:
• Divisão por zero.
• Acesso a um array utilizando-se um índice inválido.
• Tentativa de usar uma referência null.
¨
Exceções Uma exceção é um sinal indicando uma situação excepcional, provocada por um fator externo ao programa. A ocorrência deste problema deve ser tratada por um trecho de programa que varia em natureza e quantidade de software para software.
Exemplo 14.2 Situações comuns que geram exceções (Figura a seguir):
• Tentativa de abrir um arquivo inexistente.
• Esgotamento de memória.
¨
Exceções são problemas causados por uma fonte externa ao programa. Quando uma falha acontece devido a esta fonte externa, a instrução faltosa gera uma exceção (throw an exception). Estes eventos podem ocorrer a qualquer momento, e o seu efeito é o de interromper a execução, caso a aplicação não tenha sido preparada para tratá-los
(Figura a seguir).
Estratégias de Tratamento de Exceções Três grandes estratégias podem ser aplicadas para lidar com exceções:
1. Ignorar todas, considerando apenas as mais importantes. O código fica mais claro, mas o programa irá se comportar de forma incorreta diante de uma situação
inesperada.
2. Tratar cada possibilidade juntamente com a lógica principal. O código fica
obscuro, mas o seu funcionamento é melhor. Nem todas as situções são previstas.
3. Programar a lógica normal, separada do tratamento da exceção. O texto que trata a exceção está localizado na região onde a exceção pode ocorrer. A vantagem deste enfoque é a proximidade entre a região de ocorrência da exceção e a região onde ela é tratada.
Exemplo 14.3 A Figura a seguir-a mostra o mapa de execução de um modelo de aplicação capaz de tratar exceções segundo esta última estratégia. Dois cenários de execução são apresentados:
• Figura a seguir-b: um cenário normal de execução. Neste caso, não ocorre falha no ponto a.
• Figura a seguir-c: um cenário snormal de execução. Neste caso, ocorre falha no ponto a, provocando um desvio para o trecho de rota que trata a falha.
Exemplo I
I Exemplo
a
tratamento [ Exceção ]
(a)
a
tratamento [ Exceção ]
(b)
a
tratamento [ Exceção ]
(c)
Figura 1: (a) Um mapa de execução com tratamento de exceção, (b) um cenário normal de execução, (c) e outro anormal.
¨
2 Tratamento de Exceções em Java
Blocos try Uma exceção que ocorre em um bloco try é normalmente tratada por um código especificado no bloco catch imediato:
hPadrão de tratamento de exceções em Javai≡
try {
// lógica "normal" (ignorando quaisquer exceções"
}
catch( <Tipo da Exceção> exceção ) { // tratamento da exceção
}
Exemplo 14.4 Considere o mapa de execução de uma aplicação que solicita um número para o usuário, mostrado na Figura a seguir(a).
main()
dado ← obterString()
numero ← converterInt( dado )
mostrar( numero ) exit( 0 )
(a)
main()
dado ← obterString()
numero ← converterInt( dado )
mostrar( numero ) exit( 0 )
(b)
main()
dado ← obterString()
numero ← converterInt( dado )
(c)
Figura 2: Um mapa de execução (a) para conversão de texto em número, um cenário normal (b) e outro anormal (c) de execução.
Exemplo I
I Exemplo Supondo que o valor do dado de entrada corresponda a 2, este mapa é percorrido do início ao fim sem a ocorrência de erros. Este cenário normal pode ser visualizado como na Figura a seguir(b). Entretanto, se 2.5 for usado como valor do dado de entrada, um cenário anormal é observado pela ocorrência de uma exceção, como mostrado na Figura a seguir(c).
Exemplo I
I Exemplo Este mapa pode ser implementado da seguinte forma em Java:
hExemplo de um programa com faltai≡
import javax.swing.JOptionPane;
public class Aplicacao {
public static void main( String[] args ) { String dado =
JOptionPane.showInputDialog( "Digite um numero:" );
int numero = Integer.parseInt( dado ); // <- falta System.out.println( numero );
System.exit( 0 );
} }
Exemplo I
I Exemplo A ocorrência da exceção é conseqüência de uma falha de execução. Tais exceções
podem ser tratadas por programação Figura a seguir.
main()
dado ← obterString()
numero ← converterInt( dado )
mostrar( numero ) exit( 0 )
[ Exceção ]
mostrar ( “Dado não numérico” )
Exemplo I
I Exemplo
main()
dado obterString()
numero converterInt( dado )
mostrar( numero ) exit( 0 )
[ Exceção ]
mostrar ( “Dado não numérico” )
(a)
main()
dado obterString()
numero converterInt( dado )
mostrar( numero ) exit( 0 )
[ Exceção ]
mostrar ( “Dado não numérico” )
(b)
Figura 3: Um mapa de execução para conversão de texto em número, um ce- nário com tratamento da exceção (a) e outro normal (b) de execução.
Em Java, pode-se tratar a exceção provocada pela falha de execução por um bloco try:
hExemplo de um programa com falta e tratamento de exceçãoi≡
import javax.swing.JOptionPane;
public class Aplicacao {
public static void main( String[] args ) { String dado =
JOptionPane.showInputDialog( "Digite um numero:" );
int numero = -1;
try {
numero = Integer.parseInt( dado );
}
catch( NumberFormatException ref ) { JOptionPane.showMessageDialog( null,
"Voce deve digitar um numero",
"Formato de numero invalido", JOptionPane.ERROR_MESSAGE );
}
System.out.println( numero );
System.exit( 0 );
} }
¨
Exercício 14.1
Escrever um programa que, ao ser executado, obtenha dois números do usuário (via teclado) e mostre a divisão entre eles.Tarefa 14.1.1 Crie o projeto ex14.1.
Tarefa 14.1.2 Crie a classe Divisor, contendo o método dividir(a:int, b:int):int. Ao ser executado, este método divide o valor da variável a pelo valor da variável b, retornando o resultado.
Tarefa 14.1.3 Qual resultado é calculado quando os números de entrada são a=3 e b=6?
Tarefa 14.1.4 Qual exceção é gerada quanto se tenta calcular a divisão por ZERO (ou seja, b=0)? Como pode ser tratada?
RESOLVER...
Exercício 14.2
No programa anterior, substitua os tipos das variáveis a e b por double e repita o experimento. Como se diferenciam os resultados?RESOLVER...
Exercício 14.3
PROBLEMA DE SCOTT Considere o seguinte problema, definido para inteiros positivos:a) Escolha um número.
b) Repetidamente, faça:
• Se o número for 1, páre.
• Se o número for par, divida-o pela metade.
• Se o número for ímpar, multiplique-o por 3 e some 1.
Ex.: começando pelo número 17, obtém-se a seqüência:
h17,52,26,13,40,20,10,5,16,8,4,2,1i
Este procedimento sempre pára qualquer entrada? Até agora, este é um problema sem solução: não se conseguiu provar que sempre pára, nem se conseguiu um
contra-exemplo.
Tarefa 14.3.1 Escreva uma aplicação que faça o seguinte:
a) Imprima seu nome.
b) Para cada número de 1 até 20, imprima a linha que começa com o número, seguido por dois pontos, seguido pela seqüência de Scott que começa com o
número. Separe os números da seqüência por um espaço. Ex.: no caso do número 17:
17: 52 26 13 40 20 10 5 16 8 4 2 1
RESOLVER...
2.1 Hierarquia de Exceções
A tecnologia Java classifica os eventos gerados pelas falhas de execução em erros e exceções. Estas, por sua vez, podem ser exceções pré-definidas ou definidas pelo usuário (Figura a seguir).
RuntimeException Usuário Error Exception
Throwable
• Throwable – unifica as noções de erros e exceções.
• Error - não deve ser tratado; deve ser corrigido.
• Exception – pode ser tratado.
– RuntimeException – recebem um tratamento padrão do ambiente de execução Java.
– Usuário – para tratamento especificado pelo usuário.
Dos diversos erros e exceções definidos pela tecnologia Java, as seguintes são as mais comuns:
• IOException – um problema de comunicação externa.
– FileNotFoundException – arquivo inexistente
– EOFException – tentativa de leitura após o término do arquivo
• NullPointerException – tentativa de usar um contexto null (RuntimeException).
• NumberFormatException – tentativa converter um String não-numérico em número (RuntimeException).
• OutOfMemoryError – programa que esgotou toda a memória disponível (Error).
• IllegalArgumentException – argumentos ilegais na execução de um método.
2.2 Lançamento e Captura de Exceções
Lançamento de Exceções O lançamento de uma exceção é feito quando se cria um objeto de uma classe Throwable, passando-a para o mecanismo throw.
Exceções podem ser lançadas apenas durante a execução de um método, desde que haja uma indicação de quais classes de exceções ele poderá lançar.
Exemplo 14.5 Considere o tanque representado pelo esquema da Figura a seguir.
conteúdo
capacidade delta
Tanque
Exemplo I
I Exemplo Em Java, o tanque pode ser descrito da seguinte forma:
hlab/tanque/Tanquei≡
public class Tanque {
public int capacidade = 5000; // litros public int conteudo; // do tanque
hTanque: métodosi }
O método de construção de tanques vazios é imediato:
hTanque: métodosi≡
// Construtor de tanques vazios:
public Tanque() { conteudo = 0;
}
Exemplo I
I Exemplo Entretanto, pode-se construir um tanque a partir de uma determinada quantidade inicial de água. Neste caso, duas situações deverão ser tratadas no modelo computacional do tanque:
• quantidade inicial contendo um valor negativo, a qual deverá ser rejeitada, impedindo-se a construção do respectivo tanque.
• quantidade inicial superando a capacidade do tanque, que também deverá ser rejeitada, impedindo-se a construção do respectivo tanque.
Exemplo I
I Exemplo Para impedir que um objeto da classe Tanque seja criado, lança-se uma exceção
apropriada:
hTanque: métodosi+≡
public Tanque( int inicial )
throws TanqueTransbordouException, IllegalArgumentException { if( inicial < 0 ) {
throw new IllegalArgumentException();
}
int delta = inicial - capacidade;
if( delta > 0 ) {
throw new TanqueTransbordouException( this, delta );
}
conteudo = inicial;
}
Exemplo I
I Exemplo Este construtor faz uso de duas classes de exceção:
• IllegalArgumentException – indicando que a quantidade inicial é ilegal.
Esta classe é oferecida pela bibliteca de classes do ambiente Java.
• TanqueTransbordouException – criada para este programa, indicando que o tanque contém excesso de água. É um exemplo de exceção do usuário.
Exemplo I
I Exemplo A codificação da classe TanqueTransbordouException segue o roteiro
estabelecido pela tecnologia Java:
hlab/tanque/TanqueTransbordouException.javai≡
public class TanqueTransbordouException extends Exception { public Tanque tanqueTransbordado;
public int excesso;
public TanqueTransbordouException( Tanque novo,
int quantidade ) { super();
tanqueTransbordado = novo;
excesso = quantidade;
} }
Exemplo I
I Exemplo O método para inserir uma determinada quantidade de água no tanque pode ser descrito da seguinte forma:
hTanque: métodosi+≡
public void acrescentar( int quantidade )
throws TanqueTransbordouException, IllegalArgumentException { // 1: verificação de argumento
if ( quantidade < 0 ) {
throw new IllegalArgumentException();
}
// 2: verificação de transbordamento
int delta = ( quantidade + conteudo ) - capacidade;
if ( delta > 0 ) {
throw new TanqueTransbordouException( this, delta );
}
// 3: confirmação de conteúdo conteudo += quantidade;
}
As duas primeiras verificações podem lançar exceções: uma devido a um valor
negativo, outra devido ao transbordamento do tanque de água. Caso nenhuma exceção seja lançada, o conteúdo do tanque é alterado de acordo com a quantidade de água informada.
Exemplo I
I Exemplo A retirada de água segue um padrão similar, devendo-se considerar, no entanto, a
possibilidade de retirada além do conteúdo atual do tanque:
hTanque: métodosi+≡
public void retirar( int quantidade )
throws TanqueInsuficienteException, IllegalArgumentException { // 1: verificação de argumento
if ( quantidade < 0) {
throw new IllegalArgumentException();
}
// 2: verificação de falta
int delta = quantidade - conteudo;
if( delta > 0 ) {
throw new TanqueInsuficienteException( this, delta );
}
// 3: confirmação de conteúdo conteudo -= quantidade;
}
Observa-se a utilização de uma nova classe de exceção:
TanqueInsuficienteException.
Esta classe segue o formato padrão sugerido pela tecnologia Java:
hlab/tanque/TanqueInsuficienteException.javai≡
public class TanqueInsuficienteException extends Exception { public Tanque tanqueInsuficiente;
public int falta;
public TanqueInsuficienteException( Tanque novo,
int quantidade ) { super();
tanqueInsuficiente = novo;
falta = quantidade;
} }
¨
Exercício 14.4
LANÇAMENTO DE EXCEÇÕES Considere o modelo do tanque de água descrito no texto.Tarefa 14.4.1 Crie o projeto ex14.4.
Tarefa 14.4.2 Crie as classes Tanque, TanqueTransbordouException e TanqueInsuficienteException, conforme indicado no exemplo do texto.
Tarefa 14.4.3 Crie o tanque t1:Tanque com uma quantidade inicial de 1000 litros de água. Abra a janela de inspeção da instância t1.
Tarefa 14.4.4 Envie a mensagem t1.acrescentar(2000) e observe se o conteúdo do tanque se alterou de acordo.
Tarefa 14.4.5 Envie a mensagem t1.retirar(500) e observe se o conteúdo do tanque se alterou de acordo.
Tarefa 14.4.6 Envie a mensagem t1.acrescentar(3000). Qual a reação do computador? Porquê?
Tarefa 14.4.7 Crie um novo tanque t2, vazio e envie a mensagem t1.retirar(100). Qual a reação do computador? Porquê?
RESOLVER...
Captura de Exceções As exceções lançadas durante a execução das instruções de um método podem ser capturadas pelo próprio programa, ou, em último caso, pelo ambiente de execução da tecnologia Java.
A captura de uma exceção lançada é feita com o uso do mecanismo try-catch. No bloco try, inserem-se os métodos que, ao serem executados, podem lançar exceções.
Caso alguma for lançada, a sua captura se dará em algum catch indicado junto ao mecanismo try.
Exemplo 14.6 No caso do tanque, o mecanismo de captura de exceções poderia ser utilizado da seguinte forma:
hlab/tanque/Cenario.javai≡
public class Controlador { public Tanque t1;
public void criarTanque() { t1 = new Tanque();
}
public void aumentar() { try {
System.out.println( "Conteudo = " + t1.conteudo );
t1.acrescentar( 4000 );
System.out.println( "Conteudo +4000 = " + t1.conteudo );
t1.acrescentar( 2000 ); // <- (*) }
catch( IllegalArgumentException e ) {
System.err.println("Quantidade negativa");
}
catch( TanqueTransbordouException e ) { // <- (**)
System.err.println( "Excesso de " + e.excesso );
} } }
Depois de criado um objeto da classe Controlador, ao se enviar a mensagem aumentar(), uma exceção será lançada quando o objeto t1 receber a mensagem marcada com (*). A captura desta exceção é feita no catch marcado com
TanqueTransbordouException, na linha (**). ¨
Exercício 14.5
CAPTURA DE EXCEÇÕES Considere o modelo do tanque de água descrito no texto.Tarefa 14.5.1 Crie a classe Controlador conforme indicado no exemplo do texto.
Tarefa 14.5.2 Crie o objeto c:Controlador e envie a mensagem
c.criarTanque() seguida de c.aumentar(). Qual a reação do computador?
Tarefa 14.5.3 Acrescente o método diminuir() na classe Controlador. Este método deverá enviar mensagens t1.retirar(...), forçando o lançamento da exceção TanqueInsuficienteException, a qual deverá ser adequadamente capturada.
Tarefa 14.5.4 Crie o objeto c:Controlador e envie a mensagem
c.criarTanque() seguida de c.diminuir(). Qual a reação do computador?
RESOLVER...
Semana Data Tópico
1 2004-02-18 "Apresentação: computação e programas. Bibliografia. Avali- ação."
2 2004-02-25 "RECESSO: Carnaval."
3 2004-03-03 "Organização de informações. Ambiente Java."
4 2004-03-10 "BlueJ: familiarização e computação com objetos."
5 2004-03-17 "Variáveis; valores; expressões."
6 2004-03-24 "Representação de computações. Seleção simples (teoria)."
7 2004-03-31 "Seleção dupla."
8 2004-04-07 "Seleção múltipla."
9 2004-04-14 "Iteração com contador."
10 2004-04-21 "RECESSO: Dia de Tiradentes."
11 2004-04-28 "Iteração com sentinela."
12 2004-05-05 "Comunicação com o usuário."
13 2004-05-12 "Estrutura de dados: array."
I 14 2004-05-19 "Mecanismo de Exceções em Java"
15 2004-05-26
16 2004-06-02
17 2004-06-09
18 2004-06-16
19 2004-06-23
20 2004-06-30