2016-05-01 39 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类的)方法。