Java异常处理问题:用户名与PIN码输入校验逻辑失效
问题分析与解决:Java try-catch未按预期捕获输入异常
问题根源
- 用户名输入逻辑误解:
Scanner.nextLine()会读取控制台整行输入,无论输入数字、字母还是符号,都会直接转为字符串——这属于合法输入,不会抛出异常。你想“捕获非字符串输入”的逻辑本身不成立,因为任何输入都可被视为字符串。如果需求是限制用户名不能是纯数字,需要手动判断,而非依赖try-catch。 - 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
相关产品推荐
相关产品推荐

