Quando um erro ocorre dentro do processamento do código de um método, o método pode criar um objeto para permitir que o chamador deste método seja informado sobre a natureza do erro. O objeto é chamado
exception object e é disponibilizado para o
run time system.
Para referência, ver
https://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html.
Considere o seguinte código:
// Arquivo TesteExcessao1.java
import java.io.*;
public class TesteExcessao1{
public static void main(String args[]){
try{
int a[] = new int[10];
for (int i=0;i<=10;i++)
a[i]=0;
}
catch(ArrayIndexOutOfBoundsException e){
System.out.println("Excessão lançada:" + e);
}
finally {
System.out.printf("\nfim\n");
}
}
}
Com relação ao código acima, responda as seguintes perguntas:
- Qual o erro do programa? Execute o programa e observe o resultado.
- Remova o bloco try...catch...finally e execute novamente o programa. Qual a diferença em relação a presença do try...catch?
- Quando o bloco catch é executado?
- Pode existir mais de um bloco catch? Em que casos?
- Quando o bloco finally é executado? Sua presença é obrigatória com o uso do try...catch?
- Como reconhecer quando um método lança uma excessão? (veja como exemplo o uso de arquivos, no próximo item).
- É possível escrever um método que lança uma excessão?
A linguagem Java fornece muitas classes que facilitam a manipulação de arquivos.
Para referência, ver
http://www.tutorialspoint.com/java/java_files_io.htm
Considere o seguinte código:
//Arquivo Learquivo.java
import java.io.*;
import java.util.*;
public class Learquivo{
public static void main(String args[]){
FileReader reader=null;
BufferedReader br=null;
Scanner scanner = new Scanner(System.in);
String s, arq;
int i=0;
if (args.length==0){
System.out.println("Digite o nome do arquivo: ");
arq=scanner.nextLine();
}
else
arq=args[0];
try {
reader = new FileReader(arq);
br = new BufferedReader(reader);
while( (s=br.readLine()) != null){
i++;
System.out.printf("\nLinha %d: %s", i, s);
}
System.out.printf("\n\n");
}
catch (IOException e) {
System.out.println("Erro na leitura do arquivo:" + e);
}
finally {
if(reader != null){
try {
reader.close();
} catch (IOException e) {
System.out.println("Erro fechando o arquivo" + e);
}
}
System.out.println("--- Fim de arquivo ---");
}
}
}
Com relação ao código acima, responda as seguintes perguntas:
- Porque o uso do bloco try...catch é obrigatório neste caso?
- O bloco "catch (IOException e)" trata excessões geradas por qual método?
- Inclua um bloco catch para tratar excessões geradas pelo construtor do FileReader.
- Modifique o programa para apresentar o conteúdo do arquivo da seguinte forma: uma coluna com o endereço base em Hexa, uma segunda coluna com 16 bytes em hexadecimal (sem espaços) e uma terceira coluna que apresenta os caracteres respectivos da tabela ASCII.
- Implemente um programa que lê strings digitadas pelo usuário e grava em um arquivo com nome escolhido pelo usuário. Use a classe FileWriter.