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

Java使用两个try-catch处理手机号输入仅第一个生效的问题咨询

问题根因

你遇到的第二个try-catch不生效的核心原因是Scanner输入缓冲区的残留问题:当第一个scan.nextLong()因为输入非数字内容触发异常时,用户输入的非法字符串并不会被自动从输入缓冲区中清除,会一直滞留在缓冲区中。等到第二个try块执行scan.nextLong()时,会直接读取到这段残留的非法内容,无需等待用户输入就会直接抛出异常,所以看起来就像第二个try-catch没有正常生效。

优化调整建议

  • 每次异常后清空输入缓冲区:在每个catch块中增加scan.nextLine()调用,把缓冲区中残留的非法输入和换行符清空,确保后续输入读取可以正常等待用户输入。
  • 缩小异常捕获范围:不要直接捕获顶层的Exception,改为精准捕获InputMismatchException,避免吞掉其他非输入异常,方便后续问题排查。
  • 复用公共逻辑:两个手机号的输入校验逻辑完全一致,可以抽成独立的公共方法,减少重复代码,降低后续维护成本。
  • 优化手机号读取逻辑(可选):如果存在带前缀、短号、国际区号等特殊手机号场景,建议直接用scan.nextLine()读取完整字符串后再做数字校验,避免nextLong()无法处理前导0、过长号码等问题。

优化后代码示例

import java.util.Scanner;
import java.util.InputMismatchException;

// 抽离公共的手机号输入方法
private static long inputPhoneNumber(Scanner scan, String prompt) {
    System.out.println(prompt);
    try {
        return scan.nextLong();
    } catch (InputMismatchException e) {
        System.out.println("Error number assigned = 0");
        // 清空缓冲区残留的非法内容
        scan.nextLine();
        return 0;
    }
}

// 业务调用逻辑
public void yourBusinessMethod() {
    Scanner scan = new Scanner(System.in);
    long x = inputPhoneNumber(scan, "Insert phone number: ");
    long z = inputPhoneNumber(scan, "Insert dial number: ");
    a.setPhoneNumber(x);
    a.setDialPhone(z);
    scan.close();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:21:02