Para esse laboratório vamos usar as mesmas classes do laboratório 8, então aproveite para terminar esse laboratório caso ainda não tenha acabado. O objetivo do laboratório 9 é incluir sinalização e tratamento de erros nas classes do último laboratório.
1. A primeira tarefa é impedir que contas fiquem no vermelho. Crie uma nova exceção não-checada
chamada SaldoInsuficiente
. Uma tentativa de retirar dinheiro além do saldo da conta deve
lançar essa exceção. Modifique a classe ContaCorrente
para fazer isso. O que acontece caso se tente transferir
um valor maior que o saldo restante da conta?
Relacionado à última pergunta: qual o problema com a seguinte implementação do método transfere
?
public void transfere(ContaCorrente destino, double valor) {
destino.deposita(valor);
this.retira(valor);
}
É necessário mudar alguma coisa na implementação de ContaCorrenteLanc
para ter a verificação
de saldo nela? Por quê?
2. Escreva um método void processa(BufferedReader buf)
que lê uma sequência de transações de
buf
, uma transação por linha (usando o método readLine()
de BufferedReader
), convertendo
cada linha de string para double com Double.parseDouble
e fazendo uma retirada se o número
resultante for menor do que 0 ou depósito se for maior do que 0. Capture e trate os erros SaldoInsuficiente
e NumberFormatException
: em um erro SaldoInsuficiente
você deve imprimir com System.out.println
uma mensagem
informando que não houve saldo para a retirada, e quanto seria retirado, e erros NumberFormatException
devem ser ignorados. O método processa
deve simplesmente propagar erros IOException
resultantes
da leitura de buf
.
Teste processa
com o seguinte código:
ContaCorrente c = new ContaCorrente(1234, "Fulano", 200);
String trans = "50\n-100.25\nFOO\n-200\n125.25\n-200\n-90\n-50\n";
// o processamento deve imprimir duas mensagens de saldo insuficiente
c.processa(new java.io.BufferedReader(new java.io.StringReader(trans)));
System.out.println(c.saldo); // deve imprimir 25
3. Escreva o código de tratamento de exceções para o programa a seguir, seguindo os comentários
no método actionPerformed
. O usuário deve ser informado caso as exceções citadas aconteçam,
usando o método mostraMensagem
da classe Transacoes
.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
public class Transacoes extends JFrame {
private JTextField numero;
private JTextField correntista;
private JTextField saldo;
public Transacoes() {
super("Transacoes");
setFont(new Font("SanSerif",Font.PLAIN,24));
setLayout(new GridLayout(4, 1));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(new Dimension(400, 200));
add(new JLabel("Número"));
numero = new JTextField();
add(numero);
add(new JLabel("Correntista"));
correntista = new JTextField();
add(correntista);
add(new JLabel("Saldo"));
saldo = new JTextField();
add(saldo);
JButton processar = new JButton("Processar");
processar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
// tratar exceção NumberFormatException
ContaCorrente conta = new Conta(Integer.parseInt(numero.getText()),
correntista.getText(),
Double.parseDouble(saldo.getText());
JFileChooser abreArq = new JFileChooser();
abreArq.showOpenDialog(null);
// tratar exceção FileNotFoundException
File arq = abreArq.getSelectedFile();
FileReader leitor = new FileReader(arq);
// Tratar exceção IOException e garantir que arquivo será
// sempre fechado com finally
conta.processar(new BufferedReader(new FileReader(arq)));
saldo.setText("" + conta.saldo);
leitor.close();
}
});
add(processar);
JButton limpar = new JButton("Limpar");
limpar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
numero.setText("");
correntista.setText("");
saldo.setText("");
}
});
add(limpar);
}
public void mostraMensagem(String msg) {
JOptionPane.showMessageDialog(this, msg);
}
public static void main(String s[]) {
new Transacoes().setVisible(true);
}
}
Última Atualização: 2016-05-18 10:58