Java实现setSSN校验返回false时循环重输功能的问题求助
代码问题修正说明
一、现有代码存在的核心问题
1. setSSN方法问题
- 长度校验不通过时没有错误提示,用户无法感知失败原因
- 方法命名不符合通用规范:常规setter为无返回值的赋值方法,当前方法兼具校验+赋值功能,建议命名调整(非语法错误,属于可优化项)
2. main方法问题
- 语法错误:while循环的判断条件
!employee1.setSSN(true)参数错误,setSSN要求传入String类型的SSN值,你传入了boolean类型的true,代码无法通过编译 - 逻辑错误:do代码块中已经调用
setSSN处理用户输入,但没有接收返回的校验结果,循环判断时重复调用完全不符合预期的setSSN方法,循环逻辑完全失效 - 体验问题:不管输入是否合法,都会直接打印
employee1.toString(),输入错误时展示的信息没有意义
二、修正后的代码
修正后的setSSN方法
// 兼具校验和赋值功能,可根据需求改名为validateAndSetSSN语义更清晰 public boolean setSSN(String ssN) { // 长度校验失败时增加提示 if (ssN.length() != 12) { System.out.println("错误:SSN长度必须为12位,格式要求XXX-XXX-XXXX"); return false; } if(Character.isDigit(ssN.charAt(0)) && Character.isDigit(ssN.charAt(1)) && Character.isDigit(ssN.charAt(2)) && ssN.charAt(3) == '-' && Character.isDigit(ssN.charAt(4)) && Character.isDigit(ssN.charAt(5)) && Character.isDigit(ssN.charAt(6)) && ssN.charAt(7) == '-' && Character.isDigit(ssN.charAt(8)) && Character.isDigit(ssN.charAt(9)) && Character.isDigit(ssN.charAt(10)) && Character.isDigit(ssN.charAt(11))) { ssNumber = ssN; return true; } else { System.out.println("错误:SSN格式不符合要求,正确格式为XXX-XXX-XXXX(X为数字)"); return false; } }
修正后的main方法逻辑
System.out.println("请输入你的社会安全号码,格式要求为XXX-XXX-XXXX:"); boolean ssnValid = false; do { System.out.print("SSN: "); String input1 = in.nextLine(); // 接收校验结果 ssnValid = employee1.setSSN(input1); System.out.println(); // 只有校验通过才打印员工信息 if (ssnValid) { System.out.println(employee1.toString()); System.out.println(); } // 用刚才存的校验结果判断是否要继续循环 } while(!ssnValid);
三、可选优化建议
如果熟悉正则表达式的话,可以把SSN的校验逻辑简化为一行,代码更简洁:
public boolean setSSN(String ssN) { if (ssN.matches("\\d{3}-\\d{3}-\\d{4}")) { ssNumber = ssN; return true; } System.out.println("错误:SSN格式不符合要求,正确格式为XXX-XXX-XXXX(X为数字,长度共12位)"); return false; }
内容的提问来源于stack exchange,提问作者dnl
相关产品推荐
相关产品推荐

