如何在字符串后输入整数?Scanner读取文件抛异常的解决方法
问题解答
1. 如何在输入字符串后紧接着输入一个整数?
这得看你的字符串是否包含空格来分情况处理:
情况一:字符串不含空格
如果你的字符串是单个单词(没有空格),直接用Scanner.next()读取字符串,再用nextInt()读取整数就可以了——next()会自动跳过空白字符(包括空格、换行),直到遇到下一个非空白字符开始读取,到下一个空白字符结束:
import java.util.Scanner; public class InputDemo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("请输入字符串(无空格):"); String str = sc.next(); System.out.print("请输入整数:"); int num = sc.nextInt(); System.out.println("你输入的字符串:" + str + ",整数:" + num); sc.close(); } }
情况二:字符串包含空格
如果字符串需要包含空格(比如"牛奶面包"这种带空格的名称),就得用nextLine()读取整行字符串,之后再用nextInt()读取整数。这里要注意:nextLine()会读取从当前位置到换行符的所有内容(并自动移除换行符),所以直接按顺序调用就行,不需要额外处理:
import java.util.Scanner; public class InputDemo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("请输入字符串(可含空格):"); String str = sc.nextLine(); System.out.print("请输入整数:"); int num = sc.nextInt(); System.out.println("你输入的字符串:" + str + ",整数:" + num); sc.close(); } }
2. 修复重定向输入时的NoSuchElementException异常
你的问题根源绝对不是next()和nextInt()的调用顺序,而是你在Product类里每个实例都新建了一个Scanner关联System.in!
为什么会报错?
当你用命令行重定向input.txt作为输入时,每个Product里的Scanner都会共享同一个System.in输入流。而Scanner被垃圾回收时,会自动调用close()方法关闭底层的输入流(也就是System.in)。一旦System.in被关闭,后续所有尝试读取它的操作都会抛出NoSuchElementException——因为流已经没有内容可读了。
手动输入时没立刻出问题,是因为手动输入的流是持续开放的,垃圾回收的时机没那么快,但其实手动输入时也存在潜在风险,只是没立刻暴露。
修复方案
整个程序只使用一个Scanner实例,把它传递给Product的读取方法,而不是每个Product自己创建:
修改后的代码示例:
import java.io.*; import java.util.*; class Product { int productID; String productName; // 接收外部传入的Scanner来读取数据 public void loadData(Scanner sc) { productName = sc.next(); productID = sc.nextInt(); } } public class ShoppingList { public static void main(String[] args) { // 只创建一个Scanner,全局使用 Scanner sc = new Scanner(System.in); List<Product> shoppingList = new ArrayList<>(); // 先检查是否还有输入内容,避免读取空流 while (sc.hasNext()) { Product product = new Product(); product.loadData(sc); shoppingList.add(product); } // 打印购物清单 for (Product p : shoppingList) { System.out.printf("商品名称:%s,ID:%d%n", p.productName, p.productID); } // 最后统一关闭Scanner sc.close(); } }
额外注意点
- 确保你的
input.txt格式正确,每一行对应一组productName和productID,比如:Apple 1001 Banana 1002 Milk 1003 - 不要在程序中多次创建关联
System.in的Scanner,共享同一个实例才是正确的做法。
内容的提问来源于stack exchange,提问作者Stolaine
相关产品推荐
相关产品推荐

