UFPR · DELT · Contact
Programação Java
Esta aula aborda os seguintes conceitos:
  1. Tratamento de excessões.
  2. Arquivos.
Tratamento de excessões
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:
  1. Qual o erro do programa? Execute o programa e observe o resultado.
  2. Remova o bloco try...catch...finally e execute novamente o programa. Qual a diferença em relação a presença do try...catch?
  3. Quando o bloco catch é executado?
  4. Pode existir mais de um bloco catch? Em que casos?
  5. Quando o bloco finally é executado? Sua presença é obrigatória com o uso do try...catch?
  6. Como reconhecer quando um método lança uma excessão? (veja como exemplo o uso de arquivos, no próximo item).
  7. É possível escrever um método que lança uma excessão?
Criando as suas próprias excessões
É 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();
      }
    }
}
Arquivos: InsufficientFundsException.java - CheckingAccount.java - BankDemo.java

Com relação ao código acima, responda as seguintes perguntas:
  1. Compile e rode os programas.
  2. Qual a condição em que a excessão é lançada.
  3. Como o programador da classe BankDemo pode descobrir qual foi o problema que gerou a excessão?
Arquivos
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:
  1. Porque o uso do bloco try...catch é obrigatório neste caso?
  2. O bloco "catch (IOException e)" trata excessões geradas por qual método?
  3. Inclua um bloco catch para tratar excessões geradas pelo construtor do FileReader.
  4. 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.
  5. 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.
Soluções
Soluções para os problemas propostos podem ser encontradas em http://www.eletrica.ufpr.br/pedroso/2016/TE091/Programas/java

Voltar para página da TE091 2016