应使用 objects.equals(input, correct) 或 correctpassword.equals(input) 进行安全比较,先校验非空、标准化编码格式(如去连字符、清空格),再按长度、内容顺序验证,避免空指针、大小写混淆及引用比较。

用 String.equals() 判定手势密码是否正确,关键不是“能不能用”,而是“怎么用才安全、可靠”。手势密码本质是用户按特定顺序连接点阵(如 3×3 网格)形成的路径,通常以字符串形式编码(例如 "01458" 表示从第0点→第1点→第4点→第5点→第8点)。流程控制要确保比较前完成必要校验和标准化,避免空指针、大小写、空格或未初始化等导致误判。
确保输入字符串非空且已初始化
用户未绘制、中断绘制或程序未正确捕获路径时,可能得到 null 或空字符串。直接调用 equals() 会抛出 NullPointerException 或恒返回 false,但无法区分“输错了”还是“根本没输”。
- 先检查输入是否为
null或空白:if (input == null || input.trim().isEmpty()) { /* 提示重新绘制 */ } - 不要用
input.equals(correct)做第一层判断;应把常量(正确密码)放在左边,或使用Objects.equals(input, correct)防空指针
统一编码格式,避免隐式差异
手势路径编码需全程保持一致:索引从 0 开始还是 1 开始?是否含分隔符(如 "0-1-4-5-8")?是否转为小写?若前后端/存储与输入编码不一致,equals() 必然失败。
- 约定存储的正确密码是纯数字字符串(如
"01458"),输入也必须生成同样格式 - 若采集逻辑返回带连字符的字符串,绘制后立即做
input.replace("-", "")标准化 - 避免使用
toString()或拼接时引入不可见字符(如换行符),可用input.replaceAll("\s+", "")清理空白
在流程中嵌入明确的判定分支
手势验证不是单次比较,而是一组有先后顺序的检查。建议用清晰的 if-else 链,让每种失败原因可定位、可提示。
- 第一步:检查是否为空或过短(如少于4位)→ 提示“绘制至少4个点”
- 第二步:检查长度是否匹配预期(如系统要求6位)→ 不匹配直接拒绝,不进入 equals 比较
- 第三步:执行
correctPassword.equals(input)→ 成功则解锁,失败则提示“密码错误”
避免常见陷阱:大小写、引用比较、硬编码
String.equals() 区分大小写,且不能用 == 比较内容。手势密码虽多为数字,但若扩展支持字母(如加入方向标识),大小写就成问题。
- 禁用
input == correct—— 这是引用比较,几乎总为false - 若业务允许忽略大小写,用
correct.equalsIgnoreCase(input),但需确认安全性是否允许(通常手势密码不应忽略大小写) - 正确密码应来自安全存储(如加密后的 SharedPreferences 或 Keystore),而非硬编码在代码里











