java.util.NoSuchElementException不打印所需的输出

时间:2014-02-10 23:59:12

标签: java exception

我正在编写一个Java程序来尝试解析文本文件并将其内容存储在矩阵中。以下是我的Java代码:

import java.io.*;
import java.util.*;

public class Viterbi
{        
String[][] gmatrix = new String[50][4];
float[] pmatrix = new float[50];

public Viterbi(String filename)
{
    BufferedReader br = null;
    try
    {
        String currentline;
        StringTokenizer st;
        br = new BufferedReader(new FileReader(filename));

        while((currentline = br.readLine()) != null)
        {
            st = new StringTokenizer(currentline, ";");
            while(st.hasMoreTokens())
            {
                for(int i=0; i<50; i++)
                {
                    for(int j=0; j<4; j++)
                    {                                               
                        gmatrix[i][j] = st.nextToken();
                        System.out.println("i --> " + i + " j--> " + j + ": " + gmatrix[i][j]+"\t");                          
                    }

                }
            }                                                     
        }
        for(int i=0; i<50; i++)
        {
            for(int j=0; j<3; j++)
                System.out.print(gmatrix[i][j]+"\t");
            System.out.println("");
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }

    finally
    {
        try
        {
            if(br != null)
                br.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

public static void main(String[] args)
{
    Viterbi v = new Viterbi("rules.txt");
}
}

这是文本文件的内容:

S;a;S;0.6
S;b;X;0.4
X;c;$;0.1
X;X;$;0.9

我希望输出显示在gmatrix中:

S a s
S b X
X c $
X X $

但由于某种原因,我得到以下输出和异常:

i --> 0 j--> 0: S   
i --> 0 j--> 1: a   
i --> 0 j--> 2: S   
i --> 0 j--> 3: 0.6 
java.util.NoSuchElementException
at java.util.StringTokenizer.nextToken(StringTokenizer.java:349)
at Viterbi.<init>(Viterbi.java:27)
at Viterbi.main(Viterbi.java:62)

如何根据需要打印正确的输出?

2 个答案:

答案 0 :(得分:0)

在您的代码中,您只在hasNextToken()条件开始时调用while一次。 您需要与nextToken()一起调用hasNextToken()次,以确保nextToken()能够正常工作。你没有更多令牌的原因是每行只有4个令牌(显然),但你有两个for循环,试图调用nextToken()总共 50 * 4 = 200 次。

除了你如何做到这一点:你可以将currentLine分开“;”使用split()方法,然后遍历返回的String[]元素。

答案 1 :(得分:0)

在第一个while循环中,您实际上是通过解析输入文件的一行来尝试填充整个gmatrix。这不是你所期望的。由于第一行中只有4个令牌,因此当您尝试调用st.nextToken()以在程序尝试获取gmatrix[1][0]时获取下一个(不存在的)令牌时,会出现异常。< / p>

要更正代码,您应该检查并阅读第一个for(int i = ...)循环中的新输入行,并删除最多2个while循环。

示例:

for(int i = 0; ...){
    // check if there is another line in input;
    // tokenize a line of input;
    for(int j = 0; ...){
        // get a token and populate one element in gmatrix;
    }
}

而不是使用两个while循环。