在具有多行的文本文件上使用StringTokenizer时出错

use*_*294 1 java file-io stringtokenizer

我正在尝试读取文本文件并使用java中的字符串标记生成器实用程序单独拆分单词.

文本文件如下所示;

a 2000

4  
b 3000  
c 4000  
d 5000
Run Code Online (Sandbox Code Playgroud)

现在,我要做的是从文本文件中获取每个单独的字符并将其存储到数组列表中.然后我尝试打印arraylist中的每个元素.

这是我的代码;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;

public static void main(String[] args) {

    String fileSpecified = args[0];

    fileSpecified = fileSpecified.concat(".txt");
    String line;
    System.out.println ("file Specified = " + fileSpecified);

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


    try {
        FileReader fr = new FileReader (fileSpecified);
        BufferedReader br = new BufferedReader (fr);
        line = br.readLine();

        StringTokenizer token;
        while ((line  = br.readLine()) != null) {
            token = new StringTokenizer (line);
            words.add(token.nextToken());
        }
    } catch (IOException e) {
        System.out.println (e.getMessage());
    }

    for (int i = 0; i < words.size(); i++) {
        System.out.println ("words = " + words.get(i));
    }



}
Run Code Online (Sandbox Code Playgroud)

我得到的错误信息是这样的;

Exception in thread "main" java.util.NoSuchElementException   
                at java.util.StringTokenizer.nextToken<Unknown Source>  
                at getWords.main<getWords.java:32>  
Run Code Online (Sandbox Code Playgroud)

其中'getWords'是我的java文件的名称.

谢谢.

Sea*_*oyd 6

a)你总是StringTokenizer.hasMoreTokens()要先检查一下.NoSuchElementException如果没有更多令牌可用,则抛出是记录的行为:

token = new StringTokenizer (line);
while(token.hasMoreTokens())
    words.add(token.nextToken());
Run Code Online (Sandbox Code Playgroud)

b)不要为每一行创建一个新的Tokenizer,除非你的文件太大而无法放入内存.将整个文件读取到String并让tokenizer处理它