簡體   English   中英

在多行文本文件上使用 StringTokenizer 時出錯

[英]Error whilst using StringTokenizer on text file with multiple lines

我正在嘗試讀取文本文件並使用 java 中的字符串標記器實用程序單獨拆分單詞。

文本文件如下所示;

a 2000

4  
b 3000  
c 4000  
d 5000

現在,我要做的是從文本文件中獲取每個單獨的字符並將其存儲到數組列表中。 然后我嘗試最后打印 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));
    }



}

我得到的錯誤信息是這樣的;

Exception in thread "main" java.util.NoSuchElementException   
                at java.util.StringTokenizer.nextToken<Unknown Source>  
                at getWords.main<getWords.java:32>  

其中“getWords”是我的 java 文件的名稱。

謝謝你。

a) 你總是必須先檢查StringTokenizer.hasMoreTokens() 如果沒有更多令牌可用,則拋出NoSuchElementException是記錄在案的行為:

token = new StringTokenizer (line);
while(token.hasMoreTokens())
    words.add(token.nextToken());

b) 不要為每一行創建一個新的 Tokenizer,除非您的文件太大而無法放入 memory。 將整個文件讀入一個字符串,然后讓分詞器處理它

您的一般方法似乎很合理,但是您的代碼中有一個基本問題。

您的解析器很可能在輸入文件的第二行失敗。 這一行是空行,所以當你調用words.add(token.nextToken()); 你得到一個錯誤,因為沒有令牌。 這也意味着您只會在每行上獲得第一個令牌。

您應該像這樣迭代令牌:

while(token.hasMoreTokens())
{
    words.add(token.nextToken())
}

您可以在此處的 javadocs 中找到更通用的示例:

http://download.oracle.com/javase/1.4.2/docs/api/java/util/StringTokenizer.html

這個問題是由於您在嘗試獲取下一個令牌之前沒有測試是否有下一個令牌。 在調用nextToken()之前,您應該始終測試hasMoreTokens()是否返回true

但是您還有其他錯誤:

  • 讀取第一行,但未標記化
  • 您只需將每行的第一個單詞添加到單詞列表中
  • 不好的做法:令牌變量應該在循環內聲明,而不是在循環外
  • 您不會在 finally 塊中關閉您的閱讀器

您需要使用 hasMoreTokens() 方法。 還解決了 JB Nizet 指出的代碼中的各種編碼標准問題

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

public class TestStringTokenizer {

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        String fileSpecified = args[0];

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

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

        BufferedReader br =  new BufferedReader (new FileReader (fileSpecified));
        try{
            while ((line  = br.readLine()) != null) {
                StringTokenizer token = new StringTokenizer (line);
                while(token.hasMoreTokens())
                    words.add(token.nextToken());
            }
        } catch (IOException e) {
            System.out.println (e.getMessage());
            e.printStackTrace();
        } finally {
            br.close();
        }

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM