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 !