Java新手求助:为何特定密码错误信息重复打印两次?
问题分析与修复方案
核心问题1:字符验证方法逻辑完全颠倒
onlyLettersAndDigitsTest方法的目的是检查密码是否仅包含字母和数字,但当前逻辑完全相反:
- 原代码中,只要遇到一个字母/数字就返回
false,只有所有字符都不是字母/数字时才返回true - 正确逻辑应该是:遇到非字母/数字的字符立即返回
false,全部字符符合要求才返回true
修复后的方法:
public static boolean onlyLettersAndDigitsTest(String password) { for (int i = 0; i < password.length(); i++) { // 判断字符是否不是字母或数字 if (!Character.isLetterOrDigit(password.charAt(i))) { return false; } } return true; }
核心问题2:main方法中else if语句末尾多了分号
原代码中else if (onlyLettersAndDigitsTest(yolo, yolo));的分号会让条件判断的代码块为空,导致后续的printErrorMessage(2);变成独立执行的语句——不管前面的条件是否成立,只要长度验证通过,这条打印语句就会执行。同时原条件也写反了,应该检查方法返回false时打印错误。
修复后的main方法循环部分:
while (!validPassword && amountofAttempts < 4) { amountofAttempts++; String yolo = getNewPassword(input); if (!lengthTest(yolo)) { printErrorMessage(1); } else if (!onlyLettersAndDigitsTest(yolo)) { printErrorMessage(2); } // 补充:当所有验证都通过时,设置validPassword为true以退出循环 else if (containsOneToThreeDigitsTest(yolo) && differentThanLastTwoPasswordsTest(previousPassword1, previousPassword2, yolo)) { validPassword = true; System.out.println("Password is valid!"); } }
核心问题3:错误打印方法的case 2缺少break
printErrorMessage方法中,case 2没有break语句,导致打印完该case的错误信息后,会继续执行case 3的打印逻辑,造成错误信息重复/多余输出。
修复后的错误打印方法:
public static void printErrorMessage(int errorCode) { switch (errorCode) { case 1: System.out.println("Password does not meet requirement: must be between 6 and 15 characters"); break; case 2: System.out.println("Password does not meet requirement: must contain only letters and digits"); break; // 添加break终止switch case 3: System.out.println("Password does not meet requirement: must contain at least 1 digit and not more than 3"); break; case 4: System.out.println("Password does not meet requirement: must be different than previous 2 passwords"); break; } }
额外优化点
lengthTest方法可简化为:return length.length() >= 6 && length.length() < 15;containsOneToThreeDigitsTest方法可简化为:计算完数字数量后直接返回amountOfDigits >=1 && amountOfDigits <=3;differentThanLastTwoPasswordsTest方法可简化为:return !password.equals(previousPassword1) && !password.equals(previousPassword2);
内容的提问来源于stack exchange,提问作者Pnc_Gamba
相关产品推荐
相关产品推荐

