Por que meu Scanner está aberto nesse código? Como posso resolver?

package estruturasDeControle;

import java.util.Scanner;

public class ExercicioAlunos {

public static void main(String[] args) {

Scanner entrada = new Scanner(System. in );

double nota= 0;

double soma = 0;

int i;

System. out .println(“Digite as 3 notas do aluno”);

for (i = 3; i > 0; i --) {

if (nota >= 0 && nota <= 10) {

nota = entrada.nextDouble();

soma += nota;}}

double media = soma / 3;

if (media >= 7)

System. out .println(“o aluno está aprovado”);

if ( media >= 5 && media < 7)

System. out .println(“O aluno esta em recupercao”);

if ( media < 5 )

System. out .println(“O aluno foi reprovado”);

entrada.close();

}

}

Não entendi qual é a dúvida…

Mas aproveitando, use else if que fica melhor.
Da forma que você fez, ele sempre testa os 3 if's, o que não sentido, já que ele só pode cair em um deles.

Por exemplo, se a média for 8, o seu código testa se é maior ou igual a 7 e imprime a mensagem.
Depois, ele testa se está entre 5 e 7, mas para que testar isso se já vimos que é maior que 7? É redundante, por isso fica melhor colocar um else (pois se entrar no primeiro if, ele nem testa os demais).

Ou seja:

if (media >= 7)
    System.out.println("o aluno está aprovado");
else if (media >= 5)
    System.out.println("O aluno esta em recupercao");
else
    System.out.println("O aluno foi reprovado");

Primeiro testa se é maior ou igual a 7. Se for, imprime a mensagem (“aprovado”) e não testa mais nada.

Se for menor que 7, ele cai no else if, e se chegou aqui é porque com certeza é menor que 7, então não preciso testar isso de novo: só preciso ver se é maior ou igual a 5 (se não fosse menor que 7, teria entrado no primeiro if).

Por fim, se não for maior ou igual a 5, ele cai no último else - e se chegou ali é porque com certeza é menor que 5, então não preciso testar isso de novo.

1 curtida

Obrigado Hugo, fiz como você sugeriu e tentei dar uma melhorada. A pergunta sobre o Scanner é que ele fica com o aviso de que nunca será fechado toda vez que coloco o for.

System. out .println(“Digite as 3 notas do aluno”);

for (i = 0; i < 3 ; ++i) {

nota = entrada.nextDouble();

if (nota >= 0 && nota <= 10 )

soma += nota;

else break;

}

media = soma / i;

if (nota >= 0 && media <= 5 )

System. out .println(“O aluno esta Reprovado”);

else if ( media > 5 && media < 7 )

System. out .println(“O aluno está em recuperação”);

else if ( media >= 7 )

System. out .println(“O aluno passou por média”);

else System. out .println(“Nota errada”);

Nem dá bola, o compilador aponta esse warning pois o Scanner implementa Closeable.

Acontece que o seu Scanner lê o System.in e não se deve fechar o System.in.

Pra não ter mais esse warning, declara seu Scanner como atributo estático da sua classe.

3 curtidas

Coloquei como estático como você falou e deu certo!

Obrigado Staroski!