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

Java中输入含下划线的整数值触发报错的原因及解决方案

报错根本原因

这俩根本不是一套逻辑,别把编译期语法糖和运行时解析规则混为一谈:

  • Java 7 支持数值字面量写下划线是纯编译期特性:javac 编译的时候,会自动把源码里数字中间的下划线全删掉,再转成常量写进字节码。等程序跑起来的时候,JVM里根本不存在带下划线的数字,这个特性从始至终和运行时没关系。
  • Scanner.nextInt() 是运行时读输入的方法,它拿到用户输入的字符串之后,直接丢给Integer.parseInt()解析。而parseInt从设计上就只认正负号加0-9的数字,碰到下划线这种不在白名单里的字符,直接就抛InputMismatchException,根本不会做编译器那套删下划线的操作。

你自己在代码里写int x = 100_000;能跑,是因为编译完这行就变成int x = 100000;了,和你运行时让用户输入的"100_000"字符串完全是两码事。

可行实现方案

实现起来很简单,核心就是先把输入当字符串读进来,把合法的下划线去掉,再转成整数就行。如果要严格对齐Java本身的下划线规则(下划线只能夹在数字中间,不能放开头、结尾、正负号旁边,数字之间允许多个连续下划线),可以先做个格式校验,避免非法输入混进来,参考代码:

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String rawInput = sc.next().trim();
        // 校验格式合法性
        if (!rawInput.matches("[-+]?\\d+(_+\\d+)*")) {
            throw new IllegalArgumentException("非法整数格式");
        }
        // 移除下划线后转int
        int basicAmount = Integer.parseInt(rawInput.replace("_", ""));
    }
}

要是业务场景不需要卡这么严,也可以跳过正则校验,直接替换下划线再解析,只是碰到_100、100_这种非法格式的时候会直接抛NumberFormatException,按需选就行。
别折腾改Scanner分隔符、自定义匹配规则那些花活,字符串预处理是成本最低、最不容易出问题的方案。

内容的提问来源于stack exchange,提问作者HerrAlvé

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 10:15:37