java.util.NoSuchElementException未打印所需输出

java.util.NoSuchElementException未打印所需输出,java,exception,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

我正在编写一个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");
}
}
我希望输出在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)

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

在您的代码中,在while条件开始时只调用hasNextToken一次。你需要给hasNextToken打尽可能多的电话,以确保nextToken能正常工作。您在线路上没有更多令牌的原因是,显然每条线路只有4个令牌,但是您有两个for循环,它们将尝试调用nextToken总共50*4=200次


除此之外,您还可以这样做:您只需在上拆分currentLine;使用split方法,然后循环返回的字符串[]元素。

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

要更正代码,您应该检查并读取第一个forint 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循环。

我不明白。你能修改我的代码并解释一下吗?对不起,如果我在推的话,你能解释一下如何使用split方法吗?你能解释一下如何使用split方法吗?我不明白你说的。你能修改我的代码并解释一下吗?我对代码做了如下更改:forint I=0;我得到以下输出:X X$null你不再需要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;
    }
}