首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StringTokenizer NoSuchElements

StringTokenizer NoSuchElements
EN

Stack Overflow用户
提问于 2017-03-30 04:56:53
回答 1查看 44关注 0票数 0

我已经创建了一个读取文件集的方法,如下所示(//...是注释,忽略它们):

代码语言:javascript
复制
5 // n jobs 
2 // n tools
1 4 5 6 2
1 5 4 2 3

矩阵表示每个作业使用的工具,但在这里它并不重要。

下面是方法:

代码语言:javascript
复制
public static JobS inputJobMatrix(){
    String line = ""; // Line in tokenizer
    int jobN = inputJobN(); //First number of the file (jobs) works
    int toolN = inputToolN(); //Second number of the file (tools) works 
    //Instancing JobS object 
    JobS inputJobS = new JobS(jobN, toolN);
    int[][] tabFill = new int[jobN][toolN];
    int[] tabFillOrder = new int[jobN];
    try {
        // Initializing reader.
        FileReader fr = new FileReader("input.txt");
        BufferedReader br = new BufferedReader(fr);
        StringTokenizer st = new StringTokenizer(line);
        for(int i=0; i<3; i++){ //ReachFirstLine of matrix
            line = br.readLine();
            //System.out.println(line);
        }
        //Instancing tab for Job Order 1...n
        int[] a = new int[jobN];
        for (int i=0; i<jobN; i++){
            a[i]=i+1;
        }
        //Filling Order tab with Job order
        JobS.fillLine(tabFillOrder, a, 0); //Fills the tab with the tab a (make a copy of it we could say)
        //Reading the matrix line by line and filling tab line
        for(int i=0; i<jobN; i++){
            for(int j=0; j<toolN; j++){
                String str = st.nextToken();
                System.out.println(str);
                tabFill[i][j] = Integer.parseInt(str);
            }
            line = br.readLine();
        }
        inputJobS.setJobS(tabFill);
        br.close();

    } catch (IOException e) {
        System.out.println("File not found exception in inputJobMatrix.");
    }
    return inputJobS;

}

这会导致:

代码语言:javascript
复制
Exception in thread "main" java.util.NoSuchElementException
at java.util.StringTokenizer.nextToken(Unknown Source)
at pProgra.ReadJobS.inputJobMatrix(ReadJobS.java:84)
at pProgra.PPMain.main(PPMain.java:14)

我试着在我的循环中寻找问题,但没有找到任何问题,我不明白为什么它不能工作。这里的目标是用输入文件的矩阵填充一个二维整数数组(例如,我之前用作业和工具给出的那个),并将这个数组用于我的对象( jobs,如果构造函数可以提供帮助的话,我也会在这里给出它):

代码语言:javascript
复制
public class JobS {
private int[] jobOrder;
private int[][] jobS;

public JobS(int jobs, int tools){// Creates one more line for the title (jobOrder).
    super();
    int[][] tab = new int[jobs][tools]; 
    int[] tab2 = new int[jobs];
    this.jobS = tab;
    this.jobOrder = tab2;
}

和我在结尾使用的setter:

代码语言:javascript
复制
public void setJobS(int[][] jobS) {
    this.jobS = jobS;
}

我尝试了尽可能详细的代码与注释,我希望你能理解我想要做什么。

这是我第一次尝试做一个“复杂”的应用程序,所以也许我很愚蠢,忘记了一些东西,但现在我已经搜索了一个小时,仍然不知道是什么导致了这一点。

希望您能帮上忙,提前谢谢!L.L.

EN

回答 1

Stack Overflow用户

发布于 2017-03-30 05:01:24

如您所见,字符串line为空:

代码语言:javascript
复制
 String line = ""; // Line in tokenizer

所以这里的st是空的:

代码语言:javascript
复制
StringTokenizer st = new StringTokenizer(line);

因此,当你调用这个的时候:

代码语言:javascript
复制
String str = st.nextToken();

出现异常。

通过在for循环之后实例化line,确保StringTokenizer首先具有一些数据。

示例

更改此设置:

代码语言:javascript
复制
StringTokenizer st = new StringTokenizer(line);
for(int i=0; i<3; i++){ //ReachFirstLine of matrix
       line = br.readLine();
       //System.out.println(line);
}

要这样做:

代码语言:javascript
复制
for(int i=0; i<3; i++){ //ReachFirstLine of matrix
        line = br.readLine();
        //System.out.println(line);
}
StringTokenizer st = new StringTokenizer(line);

side note -这段代码:

代码语言:javascript
复制
line = br.readLine();

将在循环内的每次迭代中覆盖line的值,这可能是您想要的,但如果您想要附加readLine()获得的所有文本行,则可以这样做:

代码语言:javascript
复制
line += br.readLine();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43104032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档