Strings e exceção

8 respostas
D

Eu fiz um pequeno código, bem simples. Eu tenho dificuldade na classe string, ainda não entendi direito seu funcionamento.

Tentei algo para testar.

Eu fiz uma decisão para quando fosse digitado -1 o programa fosse encerrado, quando o programa é terminado, ocorre uma exceção.
Para cada aluno tenho cinco notas, e são 50 alunos no total. Na dúvida de não haver 50 alunos, quero terminar o programa. Digito -1 e aparece a exceção.

import java.util.*;

public class soma_media 
{

	/**
	 * @param args
	 */
	public static void main(String[] args) 
	{
		// TODO Auto-generated method stub
		//float nota[10] declaração do vetor
		//nota = new float[10] reserva espaço na memória
		//juntando tudo, float nota[] = new float[10];
		float nota[] = new float[5];
		
		float soma = 0;
		float media = 0;
		float media_total = 0;
		int i,j;
		String resp;
		Scanner n = new Scanner(System.in);
		
	for (j=0;j<=49;++i)
	{
			for (i=0;i<=4;++i)
				{
					System.out.printf("Entre com a nota: \t" + (i+1));
					nota[i] = n.nextFloat();
					soma = soma + nota[i];			
					media = soma/5;
				}
			System.out.println("A média do aluno vale " + media);
		media_total = media_total + media;
	System.out.println("Deseja sair do programa?");
	resp = n.nextLine();
	Integer.parseInt(resp);
	if (resp == "-1")
	//if (resp.equals(resp))
		break;
	}
}
}

Obrigado
Deathcon4

8 Respostas

nel

Sem falar a exceção fica dificíl.
E para que esse código?

Integer.parseInt(resp); if (resp == "-1") //if (resp.equals(resp)) break; }

Algo extremamente importante. Não se usa == para objetos, usa-se equals! :slight_smile:

M

tente assim

resp = n.nextLine();  
  
    if (resp.equals("-1"))     
        break;  
    }
D

A exceção é esta e acontece smpre que entro com um ponto flutuante.

Exception in thread main java.util.InputMismatchException

at java.util.Scanner.throwFor(Unknown Source)

at java.util.Scanner.next(Unknown Source)

at java.util.Scanner.nextFloat(Unknown Source)

at soma_media.main(soma_media.java:30)

Obrigado. É por programa tanto tempo em outra linguagem.

Bruno_Cunha

Acredito que ele esteja pegando alguma configuração do seu Locale.

Tente entrar com vírgula ao invés de ponto para as decimais que vai.

Mendigo_do_Futuro

Espero que possa ajudar, vamos ver:

O problema maior está nessa parte do código:

for (j=0;j<=49;++i) 
    {  
            for (i=0;i<=4;++i)  
                {  
                    System.out.printf("Entre com a nota: \t" + (i+1));  
                    nota[i] = n.nextFloat();  
                    soma = soma + nota[i];            
                    media = soma/5;  
                }  
            System.out.println("A média do aluno vale " + media);  
        media_total = media_total + media;  
    System.out.println("Deseja sair do programa?");  
    resp = n.nextLine();  
    Integer.parseInt(resp);  
    if (resp == "-1")  
    //if (resp.equals(resp))  
        break;  
    }

Você não está incrementando a variável j para poder sair do loop, então está em um loop infinito:

for (j=0;j<=49;++i)

Na linha 30 você está somando as notas de todos os alunos ao invés de somar as 5 notas de cada aluno para calcular a média. Para somar apenas as 5 notas de cada aluno você deve zerar a variável soma antes de entrar no loop que solicita as 5 notas.

soma = soma + nota[i];

O ideal seria a utilização de um while no loop de fora, no de dentro pode continuar utilizando o for mesmo. Ficaria assim:

while (j != -1)  // enquanto j for diferente de -1  
        {    
              
            soma = 0; // zera a variável soma  
            for (i=0;i<=4;++i)    
            {    
                System.out.printf("Entre com a nota %d: ", (i+1) );  // dessa forma a solicitação fica mais legível   
                nota[i] = n.nextFloat();    
                soma = soma + nota[i];              
                media = soma/5;    
            } // Fim de for   
            System.out.println("A media do aluno vale " + media);   
                  
            media_total = media_total + media; // não sei bem a intenção dessa linha então deixei como estava  
              
            // as duas linhas abaixo definem o fim ou a continuidade da execução  
            System.out.println("Digite -1 para sair do programa ou zero para continuar");    
                j = n.nextInt();  
        } // Fim do while

A variável i pode ser inicializada no cabeçalho da instrução for, isso evita que aconteça um confusão entre os contadores já que dessa forma a variável i só estaria disponível para a instrução for em que foi declarada, mas eu não mexi nisso, faça de modo que melhor se enquadre no que seu código deve fazer.

Apenas declare i e j de forma separada e inicialize-as com zero ou com o valor desejado:

int i = 0;
int j = 0;

Acho que isso resolve. Abraços

D

Primeiramente, muito obrigado pela ajuda. A variável media_total é para mostrar a média total de todos os 50 alunos da turma.

Mendigo_do_Futuro

Então nesse caso seria mais interessante você criar uma variável para contar a quantidade de alunos e então colocá-la no loop de fora sendo incrementada a cada iteração do loop, por exemplo “qtd_alunos”. Dessa forma você vai calcular corretamente independente da quantidade de alunos.
Depois você cria uma variável para somar as médias dos alunos, por exemplo “soma_medias”
Feito isso você precisa dividir o valor de soma_medias pela quantidade de alunos (que está na variável qtd_alunos)

Repare que nesse caso existe um erro de lógica:

media_total = media_total + media;

Para calcular a média corretamente é preciso que você faça a divisão da soma total das médias pela quantidade de alunos, o que está acontecendo é que você está simplesmente somando todas as médias.

Se eu puder ajudar em mais alguma coisa estamos aí. Abraços

D

É verdade, por isso eu removi o código e vou refazer. e Consegui fazer a pergunta para a saída do programa. Sim ou não.

Veja o código abaixo:

import java.util.Scanner;
//import java.util.InputMismatchException;
public class leitura_vetor {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//int numero[];//declaração do vetor sem quantidade determinada.
		Scanner num = new Scanner(System.in);
		
		float soma; 
		soma = 0;
		String resp;
		float[] numero = new float[10];//criação do objeto para poder usar o vetor
// podemos colocar numero = new int[10]
		 
		{
			for (int i = 0; i <=9; ++i)	
			{
				System.out.print("Digite o valor para a posicao " + (i+1) + " do vetor: ");  
				numero[i] = Float.parseFloat(num.nextLine());
				soma = soma + numero[i]; //numero é o vetor
			//numero recebe a entrada de dados declarada em scanner
			//num é a variável da classe scanner.
				System.out.println(soma);
				System.out.printf("soma: %.2f\n", soma);
			}
			System.out.println("Deseja sair?");
			resp = num.nextLine();
			if (resp.equalsIgnoreCase("s") || resp.equalsIgnoreCase("S"))
				System.exit(0);
			//else (resp.equalsIgnoreCase("n"));
			else if (resp.equalsIgnoreCase("n"));
			//continue;
						
		}	//catch (InputMismatchException e)
				//System.out.println("Parametro inválido!);
	}

}

O único problema é o não. O comando continue é só para loops, não serve para condicionais.
Também estou lendo sobre os operadores equals e ==. Eles tem funções totalmente diferentes.
Ainda não estudei sobre exceções e como tratá-las.
Veleu.

Criado 24 de janeiro de 2012
Ultima resposta 30 de jan. de 2012
Respostas 8
Participantes 5