You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在字符串后输入整数?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:58:16