2016-05-01 43 views
0

當我嘗試運行代碼:NoSuchToken例外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();         
     } 
    } 

與數據文件:

ABCDEF 
    WERTYU 

它不斷輸出:

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

我在Stack Overflow上看到了類似的問題,但在這種情況下,文本文件的第二行是空白的,因此沒有第二行肯讀。但是,此數據文件的兩行首都包含一個字符串。爲什麼一個令牌不會被讀取到第二行?

回答

0

你正在創建從第一行,當你設置S2的值,使StringTokenizer類,並沒有標記離開,因爲s1爲第一個也是唯一令牌(ABCDEF)。如果我沒有錯,當你嘗試設置s2時,你會得到例外嗎?

0

StringTokenizer docs說,如果你沒有在構造函數傳遞令牌的分隔符,它的假設是:

「\ t \ n \ r \ F」:空格字符,製表符,換行符,回車符和換頁符

。然後你要求從f.readLine()返回的字符串中讀出兩個令牌,即ABCDEF(沒有分隔符),所以拋出異常。

0

當你讀一行將返回一個字符串,直到它找到「\ n」或「\ r」和你的情況,你在每一行有令牌(我相信)。

你真的不需要StringTokenizer。

你讀的每一行實際上都是一個令牌。

另外,如果你期待各行比你需要確保你提供的分隔符的標記者瞭解同有一個以上的令牌。 StringTokenizer使用默認的分隔符集,即「\ t \ n \ r \ f」:空格字符,製表符,換行符,回車符和換頁符。分隔符字符本身不會被視爲標記。

1

如果您已準備好使用Java 7/8,則無需使用StringTokenizer即可更簡單。

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

在您的代碼:

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 

試試這個:

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

現在,通過使用上述數組列表檢查。

作爲StringTokenizer的被depricated,建議使用分割(String類的)方法。