如何使用try-catch校验用户键盘输入信息的合法性?
如何用try-catch校验Java用户输入的合法性
首先得指出你当前代码里的一个关键问题:调用newStudent.toString()来获取用户输入是完全错误的——toString()方法的作用是返回对象的字符串表示,根本不是用来读取键盘输入的。咱们先重构输入逻辑,再加入try-catch的校验机制。
通常处理键盘输入,Java里最常用的是Scanner类。下面我会给你一个完整的示例,结合try-catch来捕获输入异常,同时确保每个输入项都符合要求:
完整示例代码
import java.util.InputMismatchException; import java.util.Scanner; public class StudentInputDemo { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 读取用户名,校验非空 String username = getNonEmptyInput(scanner, "Enter username"); // 读取姓名,校验非空 String name = getNonEmptyInput(scanner, "Enter name"); // 读取姓氏,校验非空 String surname = getNonEmptyInput(scanner, "Enter surname"); // 读取部门名称,校验非空 String department = getNonEmptyInput(scanner, "Enter department name"); // 读取注册号,校验必须是正整数 int registrationNumber = getValidIntegerInput(scanner, "Enter registration number"); // 将收集到的信息传入Students对象 Students newStudent = new Students(username, name, surname, department, registrationNumber); System.out.println("已成功创建学生:" + newStudent); scanner.close(); } // 工具方法:获取非空字符串输入 private static String getNonEmptyInput(Scanner scanner, String prompt) { String input = ""; boolean isValid = false; while (!isValid) { System.out.println(prompt); try { input = scanner.nextLine().trim(); if (input.isEmpty()) { throw new IllegalArgumentException("输入不能为空,请重新输入"); } isValid = true; } catch (IllegalArgumentException e) { System.out.println("错误:" + e.getMessage()); } } return input; } // 工具方法:获取合法的整数输入 private static int getValidIntegerInput(Scanner scanner, String prompt) { int input = 0; boolean isValid = false; while (!isValid) { System.out.println(prompt); try { input = scanner.nextInt(); // 额外校验:注册号不能为负数或0 if (input <= 0) { throw new IllegalArgumentException("注册号必须是正整数,请重新输入"); } isValid = true; // 消费nextInt()留下的换行符,避免影响后续nextLine()读取 scanner.nextLine(); } catch (InputMismatchException e) { System.out.println("错误:输入不是有效的整数,请重新输入"); // 清除无效的输入内容,避免死循环 scanner.nextLine(); } catch (IllegalArgumentException e) { System.out.println("错误:" + e.getMessage()); } } return input; } } // 假设你的Students类结构如下 class Students { private String username; private String name; private String surname; private String department; private int registrationNumber; public Students(String username, String name, String surname, String department, int registrationNumber) { this.username = username; this.name = name; this.surname = surname; this.department = department; this.registrationNumber = registrationNumber; } // 重写toString()来展示学生信息 @Override public String toString() { return "Student{" + "username='" + username + '\'' + ", name='" + name + '\'' + ", surname='" + surname + '\'' + ", department='" + department + '\'' + ", registrationNumber=" + registrationNumber + '}'; } }
核心校验逻辑说明
捕获输入类型异常:当用户输入的不是整数时,scanner.nextInt()会抛出InputMismatchException,我们用try-catch捕获这个异常,提示用户重新输入,同时用scanner.nextLine()清除无效输入,避免程序陷入死循环。
自定义业务规则校验:比如要求输入不能为空、注册号必须是正整数,我们可以手动抛出IllegalArgumentException,在catch块里给用户明确的错误提示,确保输入符合业务需求。
循环校验直到合法:用while循环包裹输入逻辑,强制用户必须输入合法内容才能进入下一步,避免程序因错误输入直接崩溃。
处理换行符陷阱:使用nextInt()后,一定要调用scanner.nextLine()消费掉残留的换行符,否则后续的nextLine()会直接读取空字符串,导致输入逻辑出错。
如果需要更复杂的校验(比如用户名不能包含特殊字符、邮箱格式校验等),只需要在对应的工具方法里添加额外的判断逻辑,再抛出对应的异常即可。
内容的提问来源于stack exchange,提问作者Natasa
相关产品推荐
相关产品推荐

