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

Java使用简单循环实现OTP验证及失效跳转else问题排查

问题原因分析
  • OTP生成逻辑错误:你每次调用oTp(8)方法都会生成全新的随机OTP,注册阶段展示给用户的OTP和验证阶段调用oTp(8)生成的OTP完全不一致,自然不可能匹配成功。
  • 数组比较逻辑错误:Java中char数组的equals()方法继承自Object类,对比的是数组的内存地址而非内容,哪怕两个数组存储的字符完全相同,只要是不同的数组对象,equals()返回的就是false。
  • 循环条件逻辑错误:do-while的判断条件写的是isPasswordCorrect=false,这是赋值操作而非等值判断,会永远把变量设为false,导致即便验证通过也无法跳出循环。
修复方案
  1. 首先在NewRegandLogin类中新增成员变量,用于存储注册阶段生成的OTP:
// 新增成员变量
private char[] generatedOtp;
// 配套getter、setter
public char[] getGeneratedOtp() {
    return generatedOtp;
}
public void setGeneratedOtp(char[] generatedOtp) {
    this.generatedOtp = generatedOtp;
}
  1. 修改主类中生成展示OTP的逻辑,生成后先存储再打印:
// 替换原有System.out.println(newRegAndLogin.oTp(8));的代码
char[] otp = newRegAndLogin.oTp(8);
newRegAndLogin.setGeneratedOtp(otp);
System.out.println(otp);
  1. 修正OTP验证逻辑,导入java.util.Arrays工具类,用Arrays.equals()对比数组内容,同时不要重新生成OTP,直接和存储的generatedOtp对比:
void oTpVerification() {
    isPasswordCorrect = false;
    // 替换原有if判断逻辑
    if (Arrays.equals(oTpFromImput, generatedOtp)) {
        isPasswordCorrect = true;
        System.out.println("Logging In.....");
    }else {
        System.out.println("Incorrect password.\nPlease enter valid password: 8 alpha numeric characters(Aa,123,@,#,$,%)");
    }   
}
  1. 修正do-while循环的判断条件:
// 替换原有while (isPasswordCorrect=false)
} while (!isPasswordCorrect);
额外优化建议
  • 你在主方法中重复两次执行了loginInformation.add(newRegAndLogin),会导致列表中存在两个完全一样的对象,删除其中一次即可。
  • OTP是敏感信息,验证通过后可以调用Arrays.fill(generatedOtp, (char)0)清空数组内容,降低信息泄露风险。

内容的提问来源于stack exchange,提问作者Geri Glazer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:45:02