Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中正确结束长度不确定的循环时的文件扫描程序_Java - Fatal编程技术网

如何在java中正确结束长度不确定的循环时的文件扫描程序

如何在java中正确结束长度不确定的循环时的文件扫描程序,java,Java,我编写了一个函数,用于扫描以制表符分隔的棒球统计数据文件 public static ArrayList dataRead() throws FileNotFoundException { //ArrayList array = new ArrayList<ArrayList>(); Scanner s = new Scanner(new File("c:\\stats.txt")).useDelimiter("\r"); ArrayList<Stri

我编写了一个函数,用于扫描以制表符分隔的棒球统计数据文件

public static ArrayList dataRead() throws FileNotFoundException {
    //ArrayList array = new ArrayList<ArrayList>();
    Scanner s = new Scanner(new File("c:\\stats.txt")).useDelimiter("\r");

    ArrayList<String> array = new ArrayList<String>();
    int i = 0;
    while(s.next() != null) {
        String currentLine = s.next();
        Scanner split = new Scanner(currentLine).useDelimiter("\t");
        for(int j = 0; j < 16; j++) {
            System.out.print(split.next() + " ");

            j++;

        }
        System.out.println("\r");
    }
    s.close();
    return array;
}
publicstaticarraylistdataread()抛出FileNotFoundException{
//ArrayList数组=新的ArrayList();
扫描仪s=新扫描仪(新文件(“c:\\stats.txt”))。使用分隔符(“\r”);
ArrayList数组=新的ArrayList();
int i=0;
while(s.next()!=null){
字符串currentLine=s.next();
扫描仪拆分=新扫描仪(currentLine).useDelimiter(“\t”);
对于(int j=0;j<16;j++){
System.out.print(split.next()+);
j++;
}
System.out.println(“\r”);
}
s、 close();
返回数组;
}
此函数一直工作到文件结束。据我所知,while循环应该在文件末尾关闭,因为它返回null,但我一直得到一个nosucheelement错误。如果我能保证文件的大小,我只会使用一个大小为的for循环,但我不能,因为团队的大小在技术上可能会有所不同。如何在循环时正确结束文件扫描程序,以便关闭扫描程序?

来自:

抛出: NoTouchElementException-如果没有更多可用令牌

当文件中没有多余的行时,调用
s.next()
将抛出
NoTouchElementException
异常。您还将调用
s.next()
两次,一次在while()中,一次在循环中。您确实应该在(s.hasNext())时被调用。

来自:

抛出: NoTouchElementException-如果没有更多可用令牌


当文件中没有多余的行时,调用
s.next()
将抛出
NoTouchElementException
异常。您还将调用
s.next()
两次,一次在while()中,一次在循环中。实际上应该在调用(s.hasNext())时调用您。

for循环有两个问题:

  • 为什么
    j<16
    ?如果一行中的令牌少于16个,则将出现错误。请考虑使用while循环,使用<代码>分裂.HasNeXT()/<代码>条件,与外部while循环类似。

  • 索引变量
    j
    增加两次——一次在for循环的声明中,一次在相同for循环的be体中


  • 需要更正外部while循环以使用
    hasNext()
    而不是
    next()!=null

    for循环有两个问题:

  • 为什么
    j<16
    ?如果一行中的令牌少于16个,则将出现错误。请考虑使用while循环,使用<代码>分裂.HasNeXT()/<代码>条件,与外部while循环类似。

  • 索引变量
    j
    增加两次——一次在for循环的声明中,一次在相同for循环的be体中

  • 需要更正外部while循环以使用
    hasNext()
    而不是
    next()!=空

    只需执行以下操作:

    while(s.hasNext())
    {
        //blah
    }
    
    还可以使用
    StringTokenizer
    ,而不是
    for loop
    for令牌

    StringTokenizer str = new StringTokenizer(currentLine,"\t");
    while(str.hasMoreTokens)
    {
        System.out.print(str.nextToken());
    }
    
    只要做:

    while(s.hasNext())
    {
        //blah
    }
    
    还可以使用
    StringTokenizer
    ,而不是
    for loop
    for令牌

    StringTokenizer str = new StringTokenizer(currentLine,"\t");
    while(str.hasMoreTokens)
    {
        System.out.print(str.nextToken());
    }
    

    不要使用
    scanner.next()
    在循环条件中使用
    scanner.hasNext()
    检查是否有新元素,而不要使用
    scanner.next()
    在循环条件中使用
    scanner.hasNext()
    检查是否有新元素在while条件下。如果下一个令牌存在,它将返回true,否则返回false

    while(s.hasNext()){
    }
    
    可以在while条件下使用s.hasNext()。如果下一个令牌存在,它将返回true,否则返回false

    while(s.hasNext()){
    }
    

    我得到了它。每行的长度为17个标记。行数是可变的。我注意到在我发布后大约两秒钟,我忘了使用hasNext而不是next。我明白了。每行的长度为17个标记。行数是可变的。我注意到我在发布后大约两秒钟忘了使用hasNext而不是next。几分钟后就收到了,现在还不允许自己回答。谢谢你的关心:)一会儿就收到了,还不允许自己回答。谢谢你的关心:)