Olá pessoal… desculpem se não abri esse assunto da maneira mais correta, mas me perdoem, essa é a primeira vez que faço um post aqui no forum GUJ… com o tempo, eu vou pegando o jeito !!!
Gostaria que alguém me ajudasse a exclarecer uma dúvida em relação a classe abaixo que estou montando para uma simples apresentação de trabalho de faludade, não sei ao certo o que eu fiz de errado para o tratamento de excessão Try e Cach.
A compilação está correta mas na execução, quando eu preencho um campo string com um númerico, queria que mostrasse a mensagem de erro “Entre com números” e retornasse ao campo.
Bom, encaminhei a classe em anexo, para quem puder me dar uma força aí… conto com vocês… Obrigado !
A utilização está correta, no entanto, o tratamento try-catch no seu caso deve ser apenas na instrução onde o erro é gerado, é muito comum ver pessoas usando um try-catch para a aplicação inteira mas isso dificulta a leitura do código e gera código desnecessário.
Por exemplo:
boolean leu = true;
try {
Integer i = scanner.nextInt();
} catch(Exception e){
leu = false;
}
Mas você deve observar que as exceções lançadas no método nextInt() não são checked exceptions (exceções checadas) isso significa que o try-catch é opcional. Dando uma olhada na documentação da classe scanner (http://java.sun.com/j2se/1.5.0/docs/api/java/util/Scanner.html) você poderá notar a existencia do método hasNextInt() que já diz a você antecipadamente se existe ou não um inteiro aguardando para ser lido, e esta forma é preferível ao tratamento das exceções tanto por questões de legibilidade quanto performance.
Só para constar, procure postar seu código aqui no fórum, usando as tags para formatação e . Isso torna mais fácil para que analisem seu código (mais simples do que baixá-lo, a menos que sejam muitas classes).
/**
* Classe para consulta de telefones a partir de um nome informado por uma chave de dados: Serão lidos nomes de pessoas
* com seus respectivos numeros de telefones, sendo a quantidade determinada pelo usuário. Em seguida será perguntado ao
* usuário qual o nome que ele deseja consultar. Após sua resposta, exiba o telefone da pessoa procurada. Será Informado
* também, se o nome é inexistente no banco de dados. Para sair, deve-se digitar "fim"
*/
import javax.swing.*;
import java.util.Scanner;
public class teste01 {
public static void main(String[] args) {
int[] listFones;
String[] listNomes;
int qtde;
String pesq;
boolean achou;
try{
System.out.print("Entre com a quantidade desejada de dados: ");
qtde = new Scanner(System.in).nextInt();
listFones = new int[qtde]; // array criado
listNomes = new String[qtde]; // array criado
for (int i = 0; i < qtde; i++){ // instrução for
System.out.print("Informe o "+ (i+1) +"º Nome : ");
listNomes[i] = new Scanner(System.in).nextLine();
listNomes[i] = listNomes[i].toUpperCase(); //gera um novo String com todas as letras em maiúsculas.
System.out.print("Informe o Telefone de "+ listNomes[i] +" : ");
listFones[i] = new Scanner(System.in).nextInt();
//Esta Mensagem tem que aparecer sempre que for diferente de numeros no campo "quantidade de desej. de dados" !!!
System.out.print("Preencha com Números !!!");
}
do{
achou = false;
System.out.print("Entre com o nome a pesquisar. (Digite <fim> Para Sair.): ");
pesq = new Scanner(System.in).nextLine();
for(int i = 0; i < qtde; i++){ // inicia a pesquisa
if (listNomes[i].compareToIgnoreCase(pesq) == 0){ //compara as strings entre maiusc e minusc
System.out.print("O Telefone de "+ listNomes[i] +", é: "+ listFones[i]+ "\n");
achou = true;
}
}
if(pesq.equalsIgnoreCase("fim")){
achou = true; // apenas para tratar, mensagem não ser apresentada
System.out.print("O programa foi finalizado!\n");
}
if(achou == false)
System.out.print("Este nome não existe na sua lista de dados, " + "\ntente novamente.\n");
}
while(! (pesq.equalsIgnoreCase("fim")));
}
catch(NumberFormatException erro)
{
//Esta Mensagem tem que aparecer sempre que for diferente de numeros no campo do Telefone !!!
System.out.print("Digite apenas numeros inteiros!\n");
}
}
}
Está o seu código com os tratamentos de erros nos lugares corretos, como o amigo falou acima, locoque os try-catch no seu devido lugar, não o coloque como se quisersse tratar o programa inteiro. Tá bom?
import javax.swing.*;
import java.util.*;
import java.lang.*;
public class teste01 {
public static void main(String[] args) {
int[] listFones;
String[] listNomes;
int qtde = -1;
String pesq = "";
boolean achou = false;
// aqui o loop somente é encerrado quando o usuário digitar um número, caso ele digite
// o valor String é dada uma mensagem de erro e a pergunta é feita novamente
while (!achou)
try {
System.out.print("Entre com a quantidade desejada de dados: ");
qtde = new Scanner(System.in).nextInt();
achou = true; // quando a linha de comando chegar aqui é porque o usuário digitou um número
} catch (InputMismatchException inputMismatchException) { // captura a entrada incorreta
System.out.println("Error: Enter with integer numbers!");
}
listFones = new int[qtde]; // array criado
listNomes = new String[qtde]; // array criado
for (int i = 0; i < qtde; i++){ // instrução for
System.out.print("Informe o "+ (i+1) +"º Nome : ");
listNomes[i] = new Scanner(System.in).nextLine();
listNomes[i] = listNomes[i].toUpperCase(); //gera um novo String com todas as letras em maiúsculas.
// aqui o loop somente é encerrado quando o usuário digitar um número, caso ele digite
// o valor String é dada uma mensagem de erro e a pergunta é feita novamente
achou = false;
while (!achou)
try {
System.out.print("Informe o Telefone de "+ listNomes[i] +" : ");
listFones[i] = new Scanner(System.in).nextInt();
achou = true; // quando a linha de comando chegar aqui é porque o usuário digitou um número
} catch (InputMismatchException inputMismatchException) { // captura a entrada incorreta
System.out.println("Preencha com Números !!!");
}
}
do {
achou = false;
System.out.print("Entre com o nome a pesquisar. (Digite <fim> Para Sair.): ");
pesq = new Scanner(System.in).nextLine();
for(int i = 0; i < qtde; i++){ // inicia a pesquisa
if (listNomes[i].compareToIgnoreCase(pesq) == 0){ //compara as strings entre maiusc e minusc
System.out.print("O Telefone de "+ listNomes[i] +", é: "+ listFones[i]+ "\n");
achou = true;
}
}
if (pesq.equalsIgnoreCase("fim")){
achou = true; // apenas para tratar, mensagem não ser apresentada
System.out.print("O programa foi finalizado!\n");
}
if (achou == false)
System.out.print("Este nome não existe na sua lista de dados, " + "\ntente novamente.\n");
}
while (! (pesq.equalsIgnoreCase("fim")));
}
}
[quote=volnei]A utilização está correta, no entanto, o tratamento try-catch no seu caso deve ser apenas na instrução onde o erro é gerado, é muito comum ver pessoas usando um try-catch para a aplicação inteira mas isso dificulta a leitura do código e gera código desnecessário.
Por exemplo:
boolean leu = true;
try {
Integer i = scanner.nextInt();
} catch(Exception e){
leu = false;
}
Mas você deve observar que as exceções lançadas no método nextInt() não são checked exceptions (exceções checadas) isso significa que o try-catch é opcional. Dando uma olhada na documentação da classe scanner (http://java.sun.com/j2se/1.5.0/docs/api/java/util/Scanner.html) você poderá notar a existencia do método hasNextInt() que já diz a você antecipadamente se existe ou não um inteiro aguardando para ser lido, e esta forma é preferível ao tratamento das exceções tanto por questões de legibilidade quanto performance.
Qualquer dúvida é só falar…
Abraço[/quote]
Volnei… Fico muito grato pelas explicações, vou me aprofundar e estudar o tópico sugerido.