101 votes

Fuite de ressources: le 'in' n'est jamais fermé

Pourquoi Eclipse me donne-t-il le message "Fuite de ressources: 'in" n'est jamais fermé "dans le code suivant?

 public void readShapeData() {
        Scanner in = new Scanner(System.in);
        System.out.println("Enter the width of the Rectangle: ");
        width = in.nextDouble();
        System.out.println("Enter the height of the Rectangle: ");
        height = in.nextDouble();
 

84voto

nogard Points 4351

Parce que vous ne fermez pas votre scanner

 in.close();
 

67voto

Eric Lindauer Points 664

Comme d’autres l’ont dit, vous devez appeler «fermer» les classes d’IO. J'ajouterai que c'est un excellent endroit pour utiliser l'essai - enfin bloquer sans prise, comme ceci:

 public void readShapeData() throws IOException {
    Scanner in = new Scanner(System.in);
    try {
        System.out.println("Enter the width of the Rectangle: ");
        width = in.nextDouble();
        System.out.println("Enter the height of the Rectangle: ");
        height = in.nextDouble();
    } finally {
        in.close();
    }
}
 

Cela garantit que votre scanner est toujours fermé, garantissant ainsi un nettoyage correct des ressources.

12voto

Will Points 994

Vous avez besoin d'appeler in.close(), en finally block pour s'assurer que cela se produit.

À partir de l'Éclipse de la documentation, ici, c'est pourquoi il signale ce problème particulier (l'accent de la mienne):

Classes implémentant l'interface java.io.Fermer (depuis JDK 1.5) et java.lang.AutoCloseable (depuis JDK 1.7) sont considérés comme représentent des ressources extérieures, qui doit être fermé à l'aide de la méthode close(), quand ils ne sont plus nécessaires.

L'Eclipse Java compilateur est capable d'analyser si le code à l'aide de ces types adhère à cette politique.

...

Le compilateur drapeau [violations] avec "fuite de Ressource: "stream" n'est jamais fermée".

Explication complète ici.

7voto

Alex Points 9063

Il vous indique que vous devez fermer le scanner que vous avez instancié sur System.in avec Scanner.close() . Normalement, chaque lecteur doit être fermé.

Notez que si vous fermez System.in , vous ne pourrez plus le lire. Vous pouvez également jeter un coup d'œil à la classe Console .

 public void readShapeData() {
    Console console = System.console();
    double width = Double.parseDouble(console.readLine("Enter the width of the Rectangle: "));
    double height = Double.parseDouble(console.readLine("Enter the height of the Rectangle: "));
    ...
}
 

4voto

Dan W Points 2546

Vous devriez fermer votre scanner lorsque vous avez terminé:

 in.close();
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X