Resource Leak: ‘In’ is nooit gesloten

Waarom geeft Eclipse me het opwarming “Resource Leak: ‘in’ is nooit gesloten ‘in de volgende code?

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();

Antwoord 1, Autoriteit 100%

Omdat u uw scanner niet sluit

in.close();

Antwoord 2, Autoriteit 79%

Zoals anderen hebben gezegd, moet je ‘sluiten’ op io-klassen bellen. Ik zal toevoegen dat dit een uitstekende plek is om het proberen te gebruiken – eindelijk blokkeren zonder vangst, zoals dit:

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();
    }
}

Dit zorgt ervoor dat uw scanner altijd is gesloten, waarborgt het opruimen van de juiste resources.

Equivalent, in Java 7 of hoger, kunt u de syntaxis “Try-with-resources” gebruiken:

try (Scanner in = new Scanner(System.in)) {
    ... 
}

Antwoord 3, Autoriteit 15%

U moet oproepen in.close(), in een finallyblok om ervoor te zorgen dat deze optreedt.

Uit de Eclipse-documentatie volgt hier waaromdit specifieke probleem wordt gemarkeerd (nadrukvan mij):

Klassen die de interface java.io.Closeableimplementeren (sinds JDK 1.5)
en java.lang.AutoCloseable(sinds JDK 1.7) worden beschouwd als
vertegenwoordigen externe bronnen, die moeten worden gesloten met behulp van methode
close(), wanneer ze niet langer nodig zijn.

De Eclipse Java-compiler kan analyseren of code met behulp van dergelijke
types houdt zich aan dit beleid.

De compiler zal [schendingen] markeren met “Bronlek: ‘stream’ wordt nooit gesloten”.

Volledige uitleg hier.


Antwoord 4, autoriteit 9%

Het vertelt je dat je de Scanner die je hebt geïnstantieerd op System.inmoet sluiten met Scanner.close(). Normaal gesproken zou elke lezer gesloten moeten zijn.

Houd er rekening mee dat als u System.insluit, u er niet meer uit kunt lezen. U kunt ook een kijkje nemen op de Consoleklasse.

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: "));
    ...
}

Antwoord 5, autoriteit 8%

Als je JDK7 of 8 gebruikt, kun je try-catch met bronnen gebruiken. Hierdoor wordt de scanner automatisch gesloten.

try ( Scanner scanner = new Scanner(System.in); )
  {
    System.out.println("Enter the width of the Rectangle: ");
    width = scanner.nextDouble();
    System.out.println("Enter the height of the Rectangle: ");
    height = scanner.nextDouble();
  }
catch(Exception ex)
{
    //exception handling...do something (e.g., print the error message)
    ex.printStackTrace();
}

Antwoord 6, autoriteit 8%

// An InputStream which is typically connected to keyboard input of console programs
Scanner in= new Scanner(System.in);

de bovenstaande regel roept de Constructor of Scanner-klasse aan met argument System.in, en retourneert een verwijzing naar een nieuw geconstrueerd object.

Het is aangesloten op een invoerstroom die is aangesloten op het toetsenbord, dus nu kunt u tijdens runtime gebruikersinvoer gebruiken om de vereiste bewerking uit te voeren.

//Write piece of code 

Om het geheugenlek te verwijderen –

in.close();//write at end of code.

Antwoord 7, autoriteit 5%

Je moet sluitenuw scanner als u klaar bent:

in.close();

Antwoord 8, autoriteit 5%

het toevoegen van private static Scanner in;lost het probleem niet echt op, het verwijdert alleen de waarschuwing.
Door de scanner statisch te maken, blijft deze voor altijd open (of totdat de klas wordt uitgeladen, wat bijna “voor altijd” is).
De compiler geeft u geen waarschuwing meer, omdat u hem vertelde “Houd het voor altijd open”. Maar dat is niet wat je echt wou, omdat je bronnen moet sluiten zodra je ze niet meer nodig hebt.

hth,
Manfred.


Antwoord 9, Autoriteit 3%

In het algemeen moeten instanties van klassen die omgaan met I / O worden gesloten nadat u klaar bent met hen. Dus aan het einde van uw code kunt u in.close()toevoegen.


Antwoord 10, Autoriteit 3%

Oké, serieus, in veel gevallen tenminste, dit is eigenlijk een bug. Het verschijnt ook in de VS-code, en het is de LINTER die het einde is dat u het einde van de omsluitingsbereik hebt bereikt zonder het voorwerp van de scanner te sluiten, maar niet herkent dat het sluiten van alle open bestandsdescriptoren deel uitmaakt van procesbeëindiging. Er is geen resourcekleek omdat de middelen allemaal worden opgeruimd bij beëindiging, en het proces verdwijnt, waardoor de bron wordt gehouden.


Antwoord 11

De scanner moet worden gesloten. Het is een goede gewoonte om lezers, stromen te sluiten … en dit soort objecten om middelen en aovid-geheugenlekken te bevrijden; En doet dit in een eindelijk blok om ervoor te zorgen dat ze zijn gesloten, zelfs als er een uitzondering optreedt tijdens het hanteren van die objecten.


Antwoord 12

private static Scanner in;

Ik heb het opgelost door te verklaren als een particuliere statische scannerclass-variabele. Weet je niet zeker waarom dat het heeft opgelost, maar dat is wat een verduistering is aanbevolen.


Antwoord 13

Scanner sc = new Scanner(System.in);
//do stuff with sc
sc.close();//write at end of code.

Antwoord 14

in.close();
scannerObject.close(); 

Het zal Scannersluiten en de waarschuwing sluiten.

Other episodes