Duvida na utilização do Try e Catch!

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

valeu pela dica brada, eu nunca tinha reparado no metodo has do Scanner :slight_smile:

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).

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"

 */

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")));
  	}
}

[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]

[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.

Abração.

dar uma olhada nesse post, para ver se ajuda tb: http://blog.camilolopes.com.br/?p=439

abraco, :smiley:

Porque vocÊ não usou List?