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
相关产品推荐
相关产品推荐

