Simples código de algoritmo mas que fez oque eu nao esperava

4 respostas
janjan
public class A  {
	final static BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

	public static void p(String s) {
		java.lang.System.out.println(s);
	}

	public static void main(String... args) throws Exception {
		chamaCalcula();
	}

	public static void chamaCalcula() throws Exception {
		java.lang.System.out.print("Digite o primeiro numero para somar:");
		String n1 = A.bf.readLine();
		java.lang.System.out.print("Digite o segundo:");
		String n2 = A.bf.readLine();

		p("Resultado:" + testeCalcula(n1, n2) + "");
		p("---------");
	}

	public static float testeCalcula(String um, String dois) throws Exception {
		float f =0;
		try {
			f = Float.parseFloat(um) + Float.parseFloat(dois);
		} catch (Exception e) {
			if (e instanceof NumberFormatException) {
				p("tente novamente!");
				chamaCalcula();
			}
		}
		return f;
		
	}
}

Esse prog simplesmente imprimi a soma de 2 nros, se digitar uma letra ou numero invalido ele sugere tentar novamente…
mas se eu errar a digitação 5 vezes e acertar na sexta…
ele imprime o 1º resultado correto e mais 5 resultados zerados!

pra mim é estranho!
se souberem uma explicação simples, porem que tire a duvida!
agradeço
abraços

4 Respostas

G

é que voce declara o float f = 0. Depois voce erra o numero e cai no catch, chamando o mesmo método.

Como voce capturou a exceção, o codigo segue sendo executado, no caso o "return f; ".

Ou seja, se voce errar 10 vezes, vao ocorrer 10 “return f”, onde f será igual a Zero, declardo no começo do método!

entendeu?

luiz.portnoy

1º: Não utilize todos os métodos como static. Não que isso não seja certo mas, acaba não sendo Orientação a Objetos.
2º: Não precisa sempre escrever java.lang.System.out.print . java.lang é uma pacote que já “entendido automaticamente”, portanto não precisa declará-lo.
3º: Como o gabrielbzan falou, sempre a váriavel é zerada.

Espero ter ajudado.

ViniGodoy

O problema é que você está utilizando recursão. Quando você sair do método chamaCalcula correto, o código irá voltar para o testeCalcula que o chamou. O ideal é fazer um parseFloat de cada vez.

Outra coisa. Você criou o método p e não está usando. Também não é necessário digitar "java.lang" antes de "System.out.println". Finalmente, desde o Java 5, recomenda-se fazer entrada com a classe Scanner, no lugar da BufferedReader:

public class A  {
    final static BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

    public static void main(String... args) throws Exception {
        chamaCalcula();
    }

    public static void chamaCalcula() throws Exception {
        System.out.print("Digite o primeiro numero para somar:");
        float n1 = leFloat();
        System.out.print("Digite o segundo:");
        float n2 = leFloat();

        p("Resultado:" + testeCalcula(n1, n2) + "");
        p("---------");
    }

    public static float leFloat() {
        while (true) {
            try {
                return Float.parseFloat(bf.readLine());
            } catch (NumberFormatException e) {
                System.out.println("Tente novamente: ");
            }
        }
    }
                      
    public static float testeCalcula(float um, float dois) throws Exception {
        return um + dois;
    }
}
janjan

me acostumei usar o java.lang.System.out.println…
coisa da aplicação que trabalho, que se nao for assim nao faz o print.

esqueci de deixa o método p();
ele só fazia o println! hehehe

mas intendi a logica agora! e bom esse teu pensamento viny!
a experiencia ajuda bastante! hehe
abraços!

Criado 26 de maio de 2010
Ultima resposta 26 de mai. de 2010
Respostas 4
Participantes 4