Hoe sluit ik een scanner in Java?

Als ik ooit de volgende code uitvoer,

private static String input(String Message){
    Scanner input_scanner = new Scanner(System.in);
    System.out.print("\n" + Message);
    String string = input_scanner.nextLine();
    input_scanner.close();
    return string;
}

Ik krijg deze foutmelding:

Exception in thread "main" java.util.NoSuchElementException: No line found
    at java.util.Scanner.nextLine(Unknown Source)
    at main.learn.input(learn.java:25)
    at main.learn.main(learn.java:13)

Ik kwam erachter dat het iets te maken had met de regel input_scanner.close();maar als ik het verwijder, krijg ik waarschuwingen die zeggen:

Bronlek: “input_scanner” wordt nooit gesloten”

Kan ik de fouten op een of andere manier voorkomen en de waarschuwingen verwijderen?


Antwoord 1, autoriteit 100%

U moet controleren of u gegevens voor Scanner moet gebruiken met behulp van de hasNextLineapi, wat u zou kunnen doen als:

String string = "";
if (input_scanner.hasNextLine()) {
    string = input_scanner.nextLine();
}

Antwoord 2, autoriteit 97%

Nou, eerst raad ik je aan de API te gebruiken om de uitzonderingen te begrijpen die Java je laat zien.

Lees dit voor meer informatie over NoSuchElementException:
http://docs.oracle.com/javase/7 /docs/api/java/util/NoSuchElementException.html

Wanneer u scanner, stringtokenizer, iterators … moet verifiëren dat u meer elementen hebt om te lezen voordat u ze probeert te lezen. Als u dat niet doet, kunt u dat type uitzonderingen krijgen.

private static String input(String Message){
    Scanner input_scanner = new Scanner(System.in);
    System.out.print("\n" + Message);
    if (input_scanner.hasNextLine()){
       String string = input_scanner.nextLine();
    }
    input_scanner.close();
    return string;

Als u meer dan één regel wilt lezen, gebruikt u while (input_scanner.hasNextLine())

Uw fout gaat over de toetsenbordinvoer. Lees dit om te begrijpen of je het goed doet:
http://docs.Or .com / javase / 7 / documenten / API / JAVA / UTIL / SCANNER.HTML # HASNEXTLINE% 28% 29

PS: wordt aanbevolen om uw scanner te sluiten met input_scanner.close()wanneer u ermee klaar bent.


Antwoord 3, Autoriteit 100%

Gebruik try-with-bronnen om te garanderen dat uw scanner sluit, ongeacht of er uitzonderingen optreden.

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

U kunt dit gebruiken met alles dat autocloseerbaar is, en het is veel beter dan het vereisen van een aantal try-catch voor uitzonderingen die bij sluiting worden gegooid.


Antwoord 4, Autoriteit 25%

Eigenlijk, omdat u scanner gebruikt voor System.in, dit betekent dat het een blokkerende oproep is die vasthoudt totdat deze de eerste ingang van de gebruiker ontvangt.
Als een lokale variabele, hoeft u de scanner niet echt te sluiten en u hebt absoluut geen tijd nodig voor Hasnextline ();

private static String input(String Message){
Scanner input_scanner = new Scanner(System.in);
System.out.print("\n" + Message);
String string = input_scanner.nextLine();
return string;

Antwoord 5, autoriteit 25%

Een scanbewerking kan het wachten op invoer blokkeren. Als er geen invoer wordt ontvangen, hoeft het scannerobject niet te lezen, waardoor de uitzondering wordt gegenereerd omdat het het element dat dichtbij moet zijn niet vindt. Door te verifiëren of de stream iets bevat dat kan worden gelezen door het object te scannen, kunt u dit soort uitzonderingen krijgen.

Other episodes