使用StringTokenizer触发java.util.NoSuchElementException的问题求助
解决StringTokenizer抛出java.util.NoSuchElementException的问题
我来帮你排查这个异常的原因,以及给出修复方案:
问题根源分析
- Scanner读取方式错误
你用sc.next()来获取输入字符串,但这个方法只会读取空格分隔的单个单词。比如你输入"1 2",sc.next()只会拿到"1",这时候StringTokenizer里只有1个token,而你在循环里强制要取2个st.nextToken(),自然就会抛出NoSuchElementException。
另外,你之前用sc.nextInt()读取t后,输入流里会残留一个换行符,如果直接用sc.nextLine(),第一次会读到空字符串,这个细节也需要处理。
- 循环逻辑的漏洞
不管当前StringTokenizer里剩余多少token,你每次循环都直接取两个。如果输入的token总数是奇数(比如一行有3个数字),最后一次循环时取完第一个token后,已经没有第二个token可以取,同样会触发异常。
修复后的代码
import java.util.*; class spamclas { public static void main(String[] args) { // 注意:main方法需要加String[] args参数,否则部分运行环境会报错 Scanner sc=new Scanner(System.in); int a=0,b=0; int t=sc.nextInt(); sc.nextLine(); // 吃掉nextInt()留下的换行符,避免第一次nextLine()读到空串 while(t>0) { String s=sc.nextLine(); // 用nextLine()读取整行输入,包含所有空格分隔的内容 StringTokenizer st=new StringTokenizer(s); // 确保有足够的token再读取两个 if(st.hasMoreTokens()) { a = Integer.parseInt(st.nextToken()); // 再次检查是否有第二个token if(st.hasMoreTokens()) { b = Integer.parseInt(st.nextToken()); } else { // 可在这里处理只有一个token的情况,比如给b设默认值或提示输入错误 System.out.println("输入格式错误:缺少第二个数字"); t--; continue; } } else { System.out.println("输入格式错误:没有数字"); t--; continue; } System.out.println("a b"+a+" "+b); t--; } sc.close(); // 记得关闭Scanner资源 } }
额外说明
- 如果你的需求是每行只处理一对数字,上面的代码就足够了;如果需要处理一行里多对数字(比如
"1 2 3 4"要处理成(1,2)和(3,4)),可以把内部的判断改成循环:
while(st.hasMoreTokens()) { if(st.hasMoreTokens()) a = Integer.parseInt(st.nextToken()); else break; if(st.hasMoreTokens()) b = Integer.parseInt(st.nextToken()); else break; System.out.println("a b"+a+" "+b); }
- 另外,
main方法加上String[] args是Java规范的入口方法签名,避免部分运行环境因为缺少该参数报错。
内容的提问来源于stack exchange,提问作者amethyst stan
相关产品推荐
相关产品推荐

