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. Ver ao final do tutorial o exemplo com os motivos do uso do try...catch.
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.getMessage());
}
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?
É possível programar métodos que geram excessões. As excessões lançadas podem já ser existentes ou inventadas pelo programador.
Um bom exemplo, retirado de http://www.tutorialspoint.com/java/java_exceptions.htm é o seguinte:
// ------------------------
// http://www.tutorialspoint.com/java/java_exceptions.htm
// File Name InsufficientFundsException.java
import java.io.*;
public class InsufficientFundsException extends Exception
{
private double amount;
public InsufficientFundsException(double amount)
{
this.amount = amount;
}
public double getAmount()
{
return amount;
}
}
// ------------------------
// http://www.tutorialspoint.com/java/java_exceptions.htm
// File Name CheckingAccount.java
import java.io.*;
public class CheckingAccount
{
private double balance;
private int number;
public CheckingAccount(int number)
{
this.number = number;
}
public void deposit(double amount)
{
balance += amount;
}
public void withdraw(double amount) throws InsufficientFundsException
{
if(amount <= balance)
{
balance -= amount;
}
else
{
double needs = amount - balance;
throw new InsufficientFundsException(needs);
}
}
public double getBalance()
{
return balance;
}
public int getNumber()
{
return number;
}
}
// ------------------------
// http://www.tutorialspoint.com/java/java_exceptions.htm
// File Name BankDemo.java
public class BankDemo
{
public static void main(String [] args)
{
CheckingAccount c = new CheckingAccount(101);
System.out.println("Depositing $500...");
c.deposit(500.00);
try
{
System.out.println("\nWithdrawing $100...");
c.withdraw(100.00);
System.out.println("\nWithdrawing $600...");
c.withdraw(600.00);
}catch(InsufficientFundsException e)
{
System.out.println("Sorry, but you are short $" + e.getAmount());
e.printStackTrace();
}
}
}
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.getMessage());
}
finally {
if(reader != null){
try {
reader.close();
} catch (IOException e) {
System.out.println("Erro fechando o arquivo" + e.getMessage());
}
}
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.