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

Java异常处理问题:用户名与PIN码输入校验逻辑失效

问题分析与解决:Java try-catch未按预期捕获输入异常

问题根源

  1. 用户名输入逻辑误解:Scanner.nextLine()会读取控制台整行输入,无论输入数字、字母还是符号,都会直接转为字符串——这属于合法输入,不会抛出异常。你想“捕获非字符串输入”的逻辑本身不成立,因为任何输入都可被视为字符串。如果需求是限制用户名不能是纯数字,需要手动判断,而非依赖try-catch。
  2. PIN码未做异常防护:nextInt()读取输入时,若用户输入非整数内容,会抛出InputMismatchException,但你没为这部分代码加try-catch,会直接导致程序崩溃。

修正后的代码

如果需求是:

  • 用户名不能为纯数字
  • PIN码必须是整数,输入错误时提示并允许重新输入

可以使用以下代码:

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

public class Main {
    public static void main(String[] args) {
        Scanner myuser = new Scanner(System.in);

        // 用户名处理:禁止纯数字
        System.out.println("Enter your username: ");
        String username = myuser.nextLine();
        if (username.matches("\\d+")) {
            System.out.println("Incorrect username! 用户名不能是纯数字");
        } else {
            System.out.println("Your username is: " + username);
        }

        // PIN码处理:确保输入整数,支持重新输入
        System.out.println("Enter your pin code: ");
        int pin = 0;
        boolean isPinValid = false;
        while (!isPinValid) {
            try {
                pin = myuser.nextInt();
                isPinValid = true;
                System.out.println("Your pin code is: " + pin);
            } catch (InputMismatchException e) {
                System.out.println("Incorrect pin code! 请输入整数类型的PIN码");
                // 清除缓冲区的无效输入,避免死循环
                myuser.next();
            }
        }

        myuser.close();
    }
}

关键说明

  • 用户名判断:用正则表达式\\d+匹配纯数字字符串,符合则提示错误
  • PIN码处理:通过循环+try-catch实现输入校验,myuser.next()用于清除缓冲区中残留的非整数内容,避免程序陷入死循环
  • 捕获具体异常:使用InputMismatchException而非泛型Exception,更精准,也避免捕获无关异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 03:00:53