StringTokenizer表示java.util.NoSuchElementException

时间:2018-01-27 10:09:30

标签: java string java.util.scanner stringtokenizer

当我使用BufferedReader类以及util类运行我的代码并使用StringTokenizer类初始化BufferedReader之外的变量时,它可以正常工作但是当我使用它时它会中断输入第一个String(在代码中)时出现java.util.NoSuchElementException错误。

import java.util.*;

class spamclas
{
public static void main() 
{

    Scanner sc=new Scanner(System.in);
    int a=0,b=0;
    int t=sc.nextInt();
    while(t>0)
    {
        String s=sc.next();
        StringTokenizer st=new StringTokenizer(s);
        while(st.hasMoreTokens())
        {
            a = Integer.parseInt(st.nextToken());
            b = Integer.parseInt(st.nextToken());
        }

        System.out.println("a   b"+a+"   "+b);
        t--;
    }
}
}

2 个答案:

答案 0 :(得分:1)

条件st.hasMoreTokens()查看下次是否至少一个更多元素并且您拨打st.nextToken()两次

因此,如果只有一个元素,则条件为true,但第二个st.nextToken()会找到任何内容

由于您将1 1提供给sc.next(),因此String s仅为1next()的默认分隔符为空格),因此只有一个数字,第二个nextToken()将会出现

您最好使用sc.nextLine()并检查每个数字2 if

int t = Integer.parseInt(sc.nextLine());        // nextLine here too to consume return char
while (t > 0) {
  String s = sc.nextLine();
  StringTokenizer st = new StringTokenizer(s);
  a = b = 0;
  if (st.hasMoreTokens()) { a = Integer.parseInt(st.nextToken()); }else{ a=0; }  //line 18
  if (st.hasMoreTokens()) { b = Integer.parseInt(st.nextToken()); }else{ b=0; }  //line 19
  System.out.println("a : " + a + ", b : " + b);
  t--;
}

提示:第18行和第19行可以用三元运算符编写:

a = st.hasMoreTokens() ? Integer.parseInt(st.nextToken()) : 0;
b = st.hasMoreTokens() ? Integer.parseInt(st.nextToken()) : 0;

答案 1 :(得分:1)

首先,别担心

问题是当它到达这一行时。

b = Integer.parseInt(st.nextToken());

它是空的。

因为你把.nextToken()放在了它现在是空的。