[英]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
。
但是您還有其他錯誤:
您需要使用 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.