Java密码校验异常:同时输出成功提示与错误信息排查
问题分析与修复
核心问题
你的特殊字符校验逻辑存在两个致命问题:
- 内层循环逻辑错误:你遍历了所有预设的特殊字符,只要某一个特殊字符不在密码中就抛出异常,但实际需求是密码包含至少一个特殊字符即可,不需要覆盖所有特殊字符。这就导致只要密码里没有某个特殊字符,就会触发异常,哪怕已经包含了其他特殊字符。
- 外层循环冗余且错误:你用
for (int n = 0; n < Password.length(); n++)遍历密码的每个字符,但字母和数字的校验是对整个密码的正则匹配,每次循环都会重复检查并打印成功提示,同时也会重复执行特殊字符的错误校验逻辑。
另外还有一个编译错误:特殊字符字符串里的双引号没有转义,应该写成\"。
修复后的代码
import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class PasswordApp { public static void main(String[] args) { String filename = "C:\\Users\\gabri\\Desktop\\Generale\\Programmazione\\Java\\Password_Criteria\\Fakepassword.txt"; File file = new File(filename); String password = null; try (BufferedReader br = new BufferedReader(new FileReader(file))) { password = br.readLine(); } catch (FileNotFoundException e) { System.out.println("ERROR: File not found: " + filename); return; // 文件未找到直接退出,避免后续空指针 } catch (IOException e) { System.out.println("ERROR: Could not read the data: " + filename); return; } // 密码校验逻辑:至少包含一个字母、一个数字、一个特殊字符 try { String hasLetter = "Carattere incluso."; String hasNumber = "Numero incluso."; String hasSpecialChar = "Carattere speciale incluso."; // 转义双引号,修正编译错误 char[] specialChars = "!@#*+-_(%?/{}[].,;\":".toCharArray(); // 校验字母(不区分大小写的话用[a-zA-Z]) if (!password.matches(".*[a-z].*")) { throw new MissingCharacterException(); } System.out.println(hasLetter); // 校验数字 if (!password.matches(".*\\d.*")) { throw new MissingNumberException(); } System.out.println(hasNumber); // 校验特殊字符:只要包含任意一个即可 boolean containsSpecial = false; for (char c : specialChars) { if (password.indexOf(c) > -1) { containsSpecial = true; break; // 找到一个就停止遍历 } } if (!containsSpecial) { throw new MissingSpecialCharacterException(); } System.out.println(hasSpecialChar); System.out.println("密码校验通过!"); } catch (MissingSpecialCharacterException e) { System.out.println("ERRORE: Manca un carattere speciale."); } catch (MissingNumberException e) { System.out.println("ERRORE: Manca un numero."); } catch (MissingCharacterException e) { System.out.println("ERRORE: Manca un carattere."); } catch (NullPointerException e) { // 处理密码读取为空的情况 System.out.println("ERROR: 读取的密码为空"); } } } class MissingSpecialCharacterException extends Exception {} class MissingNumberException extends Exception {} class MissingCharacterException extends Exception {}
关键优化点
- 移除了冗余的外层密码字符遍历循环,避免重复校验和重复打印提示
- 重构特殊字符校验逻辑:遍历特殊字符数组,只要找到一个匹配项就标记为通过,不再抛出异常,遍历结束后再判断是否通过
- 修正了特殊字符字符串的双引号转义问题,解决编译错误
- 使用try-with-resources自动关闭BufferedReader,避免资源泄漏
- 添加了空指针异常处理,防止密码读取为空时触发错误
- 调整变量名(
Password改为password)符合Java命名规范
内容的提问来源于stack exchange,提问作者user13707732
相关产品推荐
相关产品推荐

