我是Java新手。我试图从文本文件中提取员工数据并将其存储在集合中。我使用Stringtokenizer从文件中获取字符串,但在第二次迭代中,while循环变为无限;它不会出现在while循环中。我的代码是:
public class Reader1 {
String a;
int i = 0;
int count = 0;
int x = 0;
int y = 0;
File f = new File(
"C:\\Documents and Settings\\kmoorthi\\Desktop\\ak\\sample.txt");
ArrayList<Employee> al = new ArrayList<Employee>();
public void notePad() throws IOException {
try {
FileReader fis = new FileReader(f);
BufferedReader br = new BufferedReader(fis);
do {
a = br.readLine();
i++;
if (i > 1) {
if (a != null) {
StringTokenizer st = new StringTokenizer(a, " ");
Employee e = new Employee();
System.out.println("hai1");
while (st.hasMoreTokens()) // here became infinite
{
count++;
if (count == 1) {
e.ename = st.nextToken();
al.add(e);
}
if (count == 2) {
e.eno = st.nextToken();
al.add(e);
}
}
}
}
} while (a != null);
br.close();
} catch (FileNotFoundException q) {
q.printStackTrace();
}
}
public void retrieve() {
Iterator<Employee> it = al.iterator();
while (it.hasNext()) {
Employee fi = (Employee) it.next();
String en = fi.ename;
System.out.println(en);
}
}
public static void main(String s[]) throws IOException {
Reader1 r = new Reader1();
r.notePad();
r.retrieve();
}
}
请提出解决方案。
答案 0 :(得分:9)
嗯,那么当count
进入3时会发生什么?你不再打电话给nextToken
,所以你永远不会用完代币。
你真的不需要那个内循环。你总是想从那个字符串中拉出2个标记,所以就这样做吧!但是,如果一行没有2个令牌,你可能需要一些错误处理。
答案 1 :(得分:2)
正如卡尔所提到的,在计数大于3之后,你没有调用nextToken。你似乎缺少的是count = 0;在if(count == 2)的近括号后面。
编辑(使答案更有用)
计数= 0;对您的问题是一个简单的解决方案。它修复了如果count大于2则停止调用st.nextToken()的事实。
考虑到你提到你的数据是一个包含两个字符串的行,它们之间有明确的分隔符,我可能会使用
e.name = line.subString(0, line.indexOf(" "));
e.no = line.subString(line.indexOf(" ") + 4);
它会比字符串标记器更好地显示错误数据。丢失的结束行可能会导致您错过或覆盖员工。
如果你真的想使用一个字符串标记器,我想你可能会选择这样的东西
count = 0;
while (st.hasMoreTokens())
{
if (count == 0)
{
e.name = st.nextToken();
}
if (count == 1)
{
e.n0 = st.nextToken();
}
st.nextToken();
count++;
}
al.add(e);
您当前的while循环可以简化为(看起来您可能还在添加一个不完整的Employee对象。使用当前的while循环)
e.name = st.nextToken();
e.n0 = st.nextToken();
al.add(e);
答案 2 :(得分:2)
试试这段代码
while(st.hasMoreTokens())
{
if(count==1)
{
e.ename=st.nextToken();
count++;
}
if(count==2)
{
e.eno=st.nextToken();
count=0;
}
a1.add(e);
}
我认为这会解决你的问题......
答案 3 :(得分:1)
问题是你没有重置计数。所以,在第一次循环之后,count == 2并且在第二次通过时,count会增加到3.因为你没有处理count == 3的情况,循环会一直持续。
答案 4 :(得分:0)
考虑当count == 3或更多时会发生什么。一旦count超过2,你就停止调用st.nextToken()。由于你没有通过调用nextToken()来推进令牌,st.hasMoreTokens()将永远返回true,你的循环永远不会退出。
答案 5 :(得分:0)
你的循环显然会挂起任何超过2个令牌的行。
在这种情况下你应该从循环中断。 E.g。
while(st.hasMoreTokens() && count < 2)
{
count++;
if(count==1)
{
e.ename=st.nextToken();
al.add(e);
}
if(count==2)
{
e.eno=st.nextToken();
al.add(e);
}
}
答案 6 :(得分:0)
通过我的脑袋运行,唯一看起来可能在该循环中某处导致无限循环的事情是该字符串中有多于2条记录。当循环迭代开始时计数小于0或大于1时,不会消耗任何令牌(通过nextToken())。
最好将所有令牌都用在一个数组中,然后保留你关心的那些。