2017-02-09 5 views
-1

Auch wenn dieser Code kompiliert:Was muss ich tun, um diesen Scanner-bezogenen Fehler zu beheben?

import java.util.Scanner; // imports the Scanner class from the java.util package 

public class ScannerPractice { 

public static void main(String args[]) { 

    Scanner word = new Scanner("word 1 2 3 4"); // creates a new Scanner objecrt with a string as its input 
    String scaStr = word.nextLine(); // converts scanner to string 

    String strArr[] = new String[10]; 
    // as long as the scanner has another character... 
    for (int i = 0; i < scaStr.length(); i++) { 

     int j = 0; 
     String k = ""; 
     // if the next token is an integer... 
     if (word.hasNextInt()) { 

      j = word.nextInt(); 
      k = String.valueOf(j); 
      strArr[i] = k; 

     } 

     // otherwise, skip over that token 
     else { 

      word.next(); 

     } 

    } 

    String k = ""; 
    // for each character in charArr 
    for (int i = 0; i < strArr.length; i++) { 

     // Accumulate each element of charArr to k 
     k += " " + strArr[i]; 

    } 
    System.out.print(k); 

} 
} 

ich diesen Fehler:

Exception in thread "main" java.util.NoSuchElementException 
    at java.util.Scanner.throwFor(Unknown Source) 
    at java.util.Scanner.next(Unknown Source) 
    at ScannerPractice.main(ScannerPractice.java:28) 

Die Ausnahme bezieht sich 28, die Linie, die ist:

word.next(); 

Ich habe versucht, Blick auf meine for-Schleife, die dem Zeichenfolgenarray Werte zuweist, aber ich konnte den Fehler immer noch nicht finden.

Ich bin mein Gehirn versucht, dies zu lösen. Sogar ein Hinweis würde am meisten geschätzt werden.

+0

Gemäß der Dokumentation wirft Scanner das, wenn Sie 'next()' aufrufen und keine Tokens mehr verfügbar sind. Und sie sind nicht verfügbar, weil sie noch nicht getippt wurden, denke ich. –

+0

Ihr Code macht keinen Sinn, weil Sie einen Scanner erstellen, der Tokens verarbeiten kann, aber dann über eine flache Zeichenfolge iterieren. Möchten Sie also mit einem Scanner oder mit einer normalen Zeichenfolge in Tokens arbeiten? –

+0

Denken Sie darüber nach, wie viele Iterationen Sie durchlaufen, wenn Sie 'scaStr.length()' für Ihre Schleife verwenden. Wenn Sie im wahrsten Sinne des Wortes nur versuchen, alle Ints aus Ihrer Zeichenfolge zu analysieren, können Sie einfach 'word.hasNextInt()' verwenden, um zu bestimmen, ob Sie weitermachen möchten oder nicht. – Dana

Antwort

1

Sie haben bereits alle Zeichenfolgen in Ihrem Scanner in dieser Zeile verbraucht.

String scaStr = word.nextLine();

So macht der Scanner nicht mehr characteres und das ist, warum Sie diesen Fehler bekommen.

Ich denke, dass Sie nicht Ihren Scanner in Zeichenfolge konvertieren müssen, um darüber zu iterieren. Sie können einfach eine while verwenden, um zu überprüfen, ob Ihre Scanner verbleibende Zeichen hat.

while(word.hasNext()) { 
    int j = 0; 
    String k = ""; 
    // if the next token is an integer... 
    if (word.hasNextInt()) { 
     j = word.nextInt(); 
     k = String.valueOf(j); 
     strArr[i] = k; 
    } 
    // otherwise, skip over that token 
    else { 
     word.next(); 
    } 
} 
0

ändern Sie die Schleife zu prüfen, ob die Scanner mehr Eingang hat:

Scanner word = new Scanner("word 1 2 3 4"); 
String strArr[] = new String[10]; 
int i = 0; 

while (word.hasNext()) { 
    int j = 0; 
    String k = ""; 

    if (word.hasNextInt()) { 
     j = word.nextInt(); 
     k = String.valueOf(j); 
     strArr[i] = k; 
    } 
    else { 
     word.next(); 
    } 
} 

Es macht keinen Sinn über die Schnur zu durchlaufen Sie bereits vom Scanner verbraucht, weil dann Sie verliere die Fähigkeit, Tokens zu entsprechen. Wenn Sie einen Zeichenketten-Tokenizer verwenden möchten, können Sie das tun, aber dann können Sie den Scanner löschen.

0

Wenn Sie Ihren Code wollen die Eingabe ändern, um korrekt zu funktionieren:

Scanner word = new Scanner("word"+"\n"+"1"+"\n"+"2"+"\n"+"3"+"\n"+"4"); 

Hinzufügen Newline-Zeichen löst das Problem.

Verwandte Themen