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.
Qualquer dúvida é só falar…
Abraço
S
sulito
valeu pela dica brada, eu nunca tinha reparado no metodo has do Scanner
M
marcobiscaro2112
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).
M
marcobiscaro2112
E o código dele:
/** * 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" */importjavax.swing.*;importjava.util.Scanner;publicclassteste01{publicstaticvoidmain(String[]args){int[]listFones;String[]listNomes;intqtde;Stringpesq;booleanachou;try{System.out.print("Entre com a quantidade desejada de dados: ");qtde=newScanner(System.in).nextInt();listFones=newint[qtde];// array criadolistNomes=newString[qtde];// array criadofor(inti=0;i<qtde;i++){// instrução forSystem.out.print("Informe o "+(i+1)+"º Nome : ");listNomes[i]=newScanner(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]=newScanner(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=newScanner(System.in).nextLine();for(inti=0;i<qtde;i++){// inicia a pesquisaif(listNomes[i].compareToIgnoreCase(pesq)==0){//compara as strings entre maiusc e minuscSystem.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 apresentadaSystem.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(NumberFormatExceptionerro){//Esta Mensagem tem que aparecer sempre que for diferente de numeros no campo do Telefone !!!System.out.print("Digite apenas numeros inteiros!\n");}}}
WendersonLP
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?
importjavax.swing.*;importjava.util.*;importjava.lang.*;publicclassteste01{publicstaticvoidmain(String[]args){int[]listFones;String[]listNomes;intqtde=-1;Stringpesq="";booleanachou=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 novamentewhile(!achou)try{System.out.print("Entre com a quantidade desejada de dados: ");qtde=newScanner(System.in).nextInt();achou=true;// quando a linha de comando chegar aqui é porque o usuário digitou um número}catch(InputMismatchExceptioninputMismatchException){// captura a entrada incorretaSystem.out.println("Error: Enter with integer numbers!");}listFones=newint[qtde];// array criadolistNomes=newString[qtde];// array criadofor(inti=0;i<qtde;i++){// instrução forSystem.out.print("Informe o "+(i+1)+"º Nome : ");listNomes[i]=newScanner(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 novamenteachou=false;while(!achou)try{System.out.print("Informe o Telefone de "+listNomes[i]+" : ");listFones[i]=newScanner(System.in).nextInt();achou=true;// quando a linha de comando chegar aqui é porque o usuário digitou um número}catch(InputMismatchExceptioninputMismatchException){// captura a entrada incorretaSystem.out.println("Preencha com Números !!!");}}do{achou=false;System.out.print("Entre com o nome a pesquisar. (Digite <fim> Para Sair.): ");pesq=newScanner(System.in).nextLine();for(inti=0;i<qtde;i++){// inicia a pesquisaif(listNomes[i].compareToIgnoreCase(pesq)==0){//compara as strings entre maiusc e minuscSystem.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 apresentadaSystem.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")));}}
I
ilbsinfo
[b]Ok… obrigado pela dica… depois que enviei é que percebi essa opção … mas, foi como eu disse, com o tempo eu vou pegando o jeito !!!
Obrigado também pelas explicações… já vou fazer os ajustes conforme vocês me explicaram.
Abração.[/b]
I
ilbsinfo
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
Volnei… Fico muito grato pelas explicações, vou me aprofundar e estudar o tópico sugerido.