StringTokenizer 说 java.util.NoSuchElementException
StringTokenizer says java.util.NoSuchElementException
当我 运行 我的代码使用 BufferedReader
class 以及 util class 并使用 [=12= 初始化 StringTokenizer
之外的变量时] class 然后它可以工作但是当我使用它时它会中断并且我在输入第一个 String s(在代码中)时得到 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--;
}
}
}
条件st.hasMoreTokens()
看是否至少有一个接下来的元素然后你调用st.nextToken()
两次
所以如果只有一个元素,条件将是 true
但第二个 st.nextToken()
会找到任何东西
因为你把1 1
给了sc.next()
,你的String s
就只有1
(next()
的默认分隔符是space) , 所以只有一个数字,第二个 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;
首先,别担心
问题是,当它到达这一行时。
b = Integer.parseInt(st.nextToken());
它是空的。
因为您将 .nextToken() 放在 a 中,所以它现在是空的。
当我 运行 我的代码使用 BufferedReader
class 以及 util class 并使用 [=12= 初始化 StringTokenizer
之外的变量时] class 然后它可以工作但是当我使用它时它会中断并且我在输入第一个 String s(在代码中)时得到 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--;
}
}
}
条件st.hasMoreTokens()
看是否至少有一个接下来的元素然后你调用st.nextToken()
两次
所以如果只有一个元素,条件将是 true
但第二个 st.nextToken()
会找到任何东西
因为你把1 1
给了sc.next()
,你的String s
就只有1
(next()
的默认分隔符是space) , 所以只有一个数字,第二个 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;
首先,别担心
问题是,当它到达这一行时。
b = Integer.parseInt(st.nextToken());
它是空的。
因为您将 .nextToken() 放在 a 中,所以它现在是空的。