Problema na saida de dados Java

Pessoal, estou reiniciando os estudos em Java básico e me deparei com um problema em saida de dados pois aparece um warning que ainda não consegui entender o que exatamente deixei de fazer ou fiz errado. Segue o código…

package exercicios;

import java.util.Scanner;

public class SaidaDeDados {
	public static void main(String[] args) {
		 Scanner teclado=new Scanner(System.in);  
			String nome= teclado.nextLine();
			float nota= teclado.nextFloat();
			System.out.printf("A nota de %s é %.1f\n ", nome, nota);
				
	}
}

Aparece uma sinalização de erro na linha 7 
Description: Resource leak: 'teclado' is never closed   

Alguem poderia me ajudar?

Scanner implementa a interface Closeable, então, se não for chamado o método close aparece esse warning.

MAS NÃO SE DEVE FECHAR UM Scanner QUE ENCAPSULA O System.in.

Então basta declarar sua variável teclado como sendo uma variável de classe e não variável local.

Olá @staroski tive uma aula sobre saida de dados ontem e estou tentando praticar. Desculpe a minha ignorância, você alertou sobre não fechar um Scanner que não encapsula o System.in .
O que seria exatamente isso? Foram os parenteses onde coloquei os System.in?

Aquele warning é porque você não chamou o método close do Scanner.
Mas nem deve chamar, pois ele encapsula o System.in.

Basta declarar sua variável teclado como sendo uma variável de classe e não variável local.

1 curtida

Quando vc faz new Scanner(algumaCoisa), está dizendo que o Scanner vai ler os dados de algumaCoisa.

Se essa algumaCoisa for o System.in, isso indica a entrada de dados padrão (no caso, seria o teclado).

Mas sempre que você abre uma stream de dados, a recomendação é que ela também seja fechada (por isso aparece esse aviso de “Resource leak”, pois ele detectou um recurso que foi aberto, mas não foi fechado).

Só que o System.in é um recurso “especial”, gerenciado pela JVM, e uma vez fechado, ele não pode ser reaberto. Ou seja, é uma exceção a esta regra de “feche tudo que você abriu”. Não precisa fechar, e nesse caso específico, o aviso pode ser ignorado.

1 curtida

Obrigado pela explicação @staroski !

Obrigado pela explicação @hugokotsubo !