2017-01-13 9 views
0

Wie kann ich überprüfen, ob ein Eingang von einem Scanner verfügbar ist, ohne Blockierung zu riskieren?Prüfen, ob der Scanner etwas enthält, während der Schleife

Betrachten Sie zum Beispiel die folgende Methode. In jeder Schleifeniteration sollte es Benutzereingaben akzeptieren, wenn es welche gibt, aber ohne Eingabe fortfahren, wenn keine eingegeben wurde. Stattdessen wartet reader.nextLine() darauf, dass der Benutzer eine Zeile eingibt, bevor er fortfährt.

public void creatureCombate() { 

    while (true) { 
     Scanner reader = new Scanner(System.in); 
     String userInput = reader.nextLine(); 

     wait(1); 
     System.out.println("Wolf attacks"); 

     if(userInput.equals("hit")){ 
      System.out.println("hit wolf"); 
     } else{ 
      System.out.println("Tries again"); 
     } 
    } 
} 
+0

Und Ihre Frage ist ... –

+3

Hmm ist es nessesary ein neues Scaner Objekt zu erstellen Jedes Mal, wenn die Schleife ausgeführt wird? Und wie @JoeC wies, warum ist es in Ihrem Fall ein Problem? Ich sehe kein Problem im obigen Code? –

+0

geben Sie bitte mehr Details über das Problem – Uzair

Antwort

0

Nein, Sie können nicht „ohne Eingabe vorgehen, wenn keine eingegeben wurde“, da alle nextXxx() und hasNextXxx() Methoden blockieren.

Wenn Code ausgeführt werden soll (z. B. Wolfsangriffe), während auf Eingabe gewartet wird, benötigen Sie mehrere Threads.

0

Sie müssen mehrere Threads verwenden und machen das main thread warten, bis input ein beendet ist oder Zeitüberschreitung, zB:

public static void main(String[] args) throws Exception { 
    final List<String> input = new ArrayList<>(); 
    Scanner scanner = new Scanner(System.in); 
    int count = 0; 
    while (count < 10) { 
     Runnable inputThread =() -> { 
      scanner.reset(); 
      System.out.println("Enter input"); 
      try{ 
       String line = scanner.nextLine(); 
       input.add(line); 
      }catch(Exception e){} 
     }; 

     Thread t = new Thread(inputThread); 
     t.start(); 

     Thread.currentThread().join(10000); 
     t.interrupt(); 

     if(input.isEmpty()){ 
      System.out.println("Nothing enteresd"); 
     } else{ 
      System.out.println("Entered :" + input.get(0)); 
      input.clear(); 
     } 
     count++; 
    } 
    scanner.close(); 
} 
Verwandte Themen