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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:31:11