2016-05-01 11 views
0

Wenn ich versuche, den Code auszuführen:NoSuchToken Ausnahme für StringTokenizer.nextToken()

import java.io.*; 
    import java.util.*; 

    class dothis { 
     public static void main (String [] args) throws IOException { 

     BufferedReader f = new BufferedReader(new FileReader("ride.in")); 

     PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("ride.out"))); 

     StringTokenizer st = new StringTokenizer(f.readLine()); 

     String s1 = st.nextToken();  
     String s2 = st.nextToken();   
     char[] arr = new char[6]; 

     if (find(s1, arr, 1) == find(s2, arr, 1)) { 
      out.print("one"); 
     } else { 
      out.println("two"); 
     } 

     out.close();         
     } 
    } 

Mit der Datendatei:

ABCDEF 
    WERTYU 

es hält auf die Ausgabe:

Exception_in_thread_"main"_java.util.NoSuchElementException 
     at_java.util.StringTokenizer.nextToken(StringTokenizer.java:349) 
     at_dothis.main(Unknown_Source) 

Ich habe eine ähnliche Frage in Stack Overflow gesehen, aber in diesem Fall ist die zweite Zeile der Textdatei leer, daher gab es keine Sekunde Ken gelesen zu werden. Die beiden ersten Zeilen dieser Datendatei enthalten jedoch jeweils einen String. Warum wird ein Token für die zweite Zeile nicht gelesen?

Antwort

0

Sie erstellen die StringTokenizer-Klasse aus der ersten Zeile. Wenn Sie also den Wert von s2 festlegen, ist kein Token mehr vorhanden, da s1 das erste und einzige Token (ABCDEF) enthält. Wenn ich nicht falsch liege, erhalten Sie die Ausnahme, wenn Sie versuchen, s2 zu setzen?

0

die StringTokenizer docs sagen, dass, wenn Sie sein kein Token-Trennzeichen in den Konstruktor übergeben, wird es angenommen:

"\ n \ r \ f t \": das Leerzeichen, das Tabulatorzeichen , das Zeilenumbruchszeichen, das Wagenrücklaufzeichen und das Vorschubrichtzeichen

. Sie fragen dann nach zwei Tokens, die aus der von f.readLine() zurückgegebenen Zeichenfolge (ABCDEF) (ohne Trennzeichen) zurückgegeben werden, sodass eine Ausnahme ausgelöst wird.

0

Wenn Sie eine Zeile lesen, wird eine Zeichenfolge zurückgegeben, bis sie "\ n" oder "\ r" gefunden hat und in Ihrem Fall haben Sie in jeder Zeile ein Token (glaube ich).

Sie brauchen wirklich keinen StringTokenizer.

Jede Zeile, die Sie lesen, ist eigentlich ein Token für Sie.

Wenn Sie außerdem erwarten, dass jede Zeile mehr als ein Token hat, müssen Sie sicherstellen, dass Sie Ihrem Tokenizer das Trennzeichen übergeben, um dasselbe zu verstehen. StringTokenizer verwendet den Standardtrennzeichensatz "\ t \ n \ r \ f": das Leerzeichen, das Tabulatorzeichen, das Zeilenumbruchzeichen, das Wagenrücklaufzeichen und das Zeichen für die Zeichenvorschubfunktion. Trennzeichen selbst werden nicht als Zeichen behandelt.

1

Wenn Sie für Java 7/8 bereit sind, können Sie es ohne StringTokenizer noch einfacher machen.

import java.io.*; 
import java.nio.file.Files; 
import java.nio.file.Paths; 
import java.util.*; 

class dothis { 
    public static void main (String [] args) throws IOException { 
    String contents = new String(Files.readAllBytes(Paths.get("ride.in"))); 
    String[] lines= contents.split("\n"); 

    PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("ride.out"))); 

    String s1 = lines[0];  
    String s2 = lines[1];   
    char[] arr = new char[6]; 

    if (find(s1, arr, 1) == find(s2, arr, 1)) { 
     out.print("one"); 
    } else { 
     out.println("two"); 
    } 

    out.close();         
    } 
} 
0

In Ihrem Code:

StringTokenizer st = new StringTokenizer(f.readLine());//f.readLine() method reads only 1 line 

String s1 = st.nextToken();  
String s2 = st.nextToken();//there is no second line, so this will give you error 

Try this:

String result = ""; 
    String tmp; 
    while((tmp = f.readLine())!= null) 
    { 
     result += tmp+"\n"; 
    } 
    StringTokenizer st = new StringTokenizer(result); 

    ArrayList<String> str = new ArrayList<String>(); 

    int count = st.countTokens(); 
    for(int i=0; i< count; i++) 
    { 
     str.add(st.nextToken()); 
    } 

Überprüfen Sie nun durch die obige Arraylist verwenden.

Da StringTokenizer nicht verwendet wird, wird empfohlen, die Methode split() der String-Klasse zu verwenden.