Jump to content
broilas

Detectar Input Inválido

Recommended Posts

broilas

Boa tarde ,

tenho o seguinte programa:

import java.util.Random;
import java.util.Scanner;
public class JogoAdivinhaNumero
{

 public static void dica(int palpite, int numero, int tentativas)
 {
if(palpite > numero)
{
  System.out.println("Seu palpite é maior que o número sorteado.");
}
else
{
  if(palpite < numero)
  {
	System.out.println("Seu palpite é menor que o número sorteado.");
  }
  else
  {
	System.out.println("Parabéns, você acertou! O número era " + numero);
	System.out.println("Você tentou " + tentativas + " vezes antes de acertar!");
  }
}

 }

 public static void main(String[] args)
 {
int palpite = 0,
	sorteado,
	tentativas = 0;

Scanner entrada = new Scanner(System.in);

Random geradorDeAleatorios = new Random();
sorteado = geradorDeAleatorios.nextInt(100) + 1;
//System.out.println("Sorteado: " + sorteado);
System.out.println("Número entre 1 e 100 sorteado!");

do
{
  System.out.printf("\n-----------------\n");
  System.out.println("Número de tentativas: " + tentativas);

  System.out.print("Qual seu palpite: ");
  palpite = entrada.nextInt();

  tentativas++;

  dica(palpite, sorteado, tentativas);
}while (palpite != sorteado);

 }

}

e queria que no palpite quando metessem uma letra não desse erro , aparece-se uma mensagem a dizer que o palpite não é válido.

Agradeço a ajuda obrigado

Edited by Rui Carlos
GeSHi

Share this post


Link to post
Share on other sites
carvalho2707

Desculpa-me se estiver enganado, mas se queres que o palpite seja uma letra então nao podes ter nextInt nesta linha:

palpite = entrada.nextInt();

Share this post


Link to post
Share on other sites
broilas

Boa Tarde ,

eu queria que o palpite seja um numero mas se o utilizador colocar uma letra queria que o programa mostra-se uma mensagem a dizer que so pode inserir numeros e pedisse para colocar de novo

Obrigado

Share this post


Link to post
Share on other sites
broilas

Boa Tarde e muito obrigado será que pode aplicar no programa porque não percebi muito bem.

Obrigado

Share this post


Link to post
Share on other sites
carvalho2707

do
{
  System.out.printf("\n-----------------\n");
  System.out.println("Número de tentativas: " + tentativas);
  System.out.print("Qual seu palpite: ");
  try{
  palpite = entrada.nextInt();
tentativas++;
  }catch(InputMismatchException e){
 System.out.println("numero nao valido");
 palpite = -1;
 }
  tentativas++;
  dica(palpite, sorteado, tentativas);
}while (palpite != sorteado);
 }

por exemplo.. assim garantes que mesmo que alguem meta um valor que nao é o esperado ele apanha esse erro, entra no catch e faz essas instruções: avisar que pos um palpite invalido e por um palpite default e retorna ao while...

O bom das excepções é que podes ter quantos catchs quiseres.. ate no futuro, possibilita-te a tratar imensos erros e basta so alterar o que esta dentro do catch para que tipo de eerro apanhar. Claro que podes fazer sempre tu uma excepção personalizada

Edited by carvalho2707

Share this post


Link to post
Share on other sites
carvalho2707

De nada :)

Usa a documentação da oracle no futuro, está super completa e tem tudo !

Share this post


Link to post
Share on other sites
Rui Carlos

Sugeria apenas que a chamada à função fosse também colocada no bloco try. Isto porque se a leitura do input falhar, não faz sentido chamar a função.

do
{
   System.out.printf("\n-----------------\n");
   System.out.println("Número de tentativas: " + tentativas);
   System.out.print("Qual seu palpite: ");
   try{
       palpite = entrada.nextInt();
       tentativas++;
       dica(palpite, sorteado, tentativas);
   }catch(InputMismatchException e){
       System.out.println("numero nao valido");
       palpite = -1;
   }
}while (palpite != sorteado);

Share this post


Link to post
Share on other sites
carvalho2707

Sugeria apenas que a chamada à função fosse também colocada no bloco try. Isto porque se a leitura do input falhar, não faz sentido chamar a função.

do
{
System.out.printf("\n-----------------\n");
System.out.println("Número de tentativas: " + tentativas);
System.out.print("Qual seu palpite: ");
try{
	palpite = entrada.nextInt();
	tentativas++;
	dica(palpite, sorteado, tentativas);
}catch(InputMismatchException e){
	System.out.println("numero nao valido");
	palpite = -1;
}
}while (palpite != sorteado);

tens razão, nem vi essa instrução ;)

Share this post


Link to post
Share on other sites
Flinger

Isso é uma pergunta ou uma afirmação?

Sim é possivel usando os membros hasNextInt(), next() e nextInt() da classe scanner. Mas o tratamento de excepções é algo bastante vulgar neste tipo de linguagens, e facilita bastante o trabalho, além de permitir tratar erros inexperados no programa.

Edited by Flinger
  • Vote 1

Share this post


Link to post
Share on other sites
saca-rolhas

Boas

é possível resolver este problema sem usar gestão de excepção

Obrigado

Caso faças o input para uma String (que come tudo o que metas lá para dentro) e depois validares com uma expressão regular se o conteúdo da String é inteiramente um numero podes então fazer o parse para o que desejas e como excepções como NumberFormatException são Runtime não necessitam de try-catch desde que te certifiques que o parse vai sempre encontrar um numero valido.


The worst part of censorship is ****

Share this post


Link to post
Share on other sites
iron

Em vez de utilizares um try catch, podes de uma maneira simples, ler para uma string e depois ver se o caracter introduzido foi um numero atraves do parseInt().


Cumprimentos,
iron

Share this post


Link to post
Share on other sites
Flinger

E que tal mostrares o que fizeste para o pessoal te explicar o que está errado?

Por princípio, neste fórum não se dá código feito, mas ensina-se os utilizadores a fazê-lo.

Share this post


Link to post
Share on other sites
saca-rolhas

Boa Noite ,

pode aplicar essa parte?

Obrigado

if (str.matches("[a-zA-Z]+$")) {
  // str consists entirely of letters
}

in: http://stackoverflow.com/questions/7939913/validating-string-input-has-no-numbers

Nesse exemplo caso haja letras na string entra dentro do if.

public static boolean containsOnlyNumbers(String str){
for(char ch : str.toCharArray()){
	if(!Character.isDigit(ch)){
		  return false;
	}
}
 return true;
}

Este aqui valida se existe apenas números e devolve false caso tenha letras ou algo do género e assim podes fazer o parseInt() sem necessitar de apanhar uma NumberFormatException

Usar o google não é como o tabaco, não faz mal à saúde.


The worst part of censorship is ****

Share this post


Link to post
Share on other sites
HappyHippyHippo

eu não sei onde o pessoal anda ler/aprender como trabalhar com Java, no entanto acho estranho que somente uma pessoa tenho referido a solução correcta de abordar o problema sem o uso do controlo de excepções (@Flinger), sendo a sugestão completamente ignorada por todos que participaram no tópico ...

boolean nasNext<TIPO>(); // <TIPO> é o tipo de dados que se pretende verificar

basta usar esse tipo de funções para criar código sem a necessidade de try/catch's


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.