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

Java密码校验异常:同时输出成功提示与错误信息排查

问题分析与修复

核心问题

你的特殊字符校验逻辑存在两个致命问题:

  1. 内层循环逻辑错误:你遍历了所有预设的特殊字符,只要某一个特殊字符不在密码中就抛出异常,但实际需求是密码包含至少一个特殊字符即可,不需要覆盖所有特殊字符。这就导致只要密码里没有某个特殊字符,就会触发异常,哪怕已经包含了其他特殊字符。
  2. 外层循环冗余且错误:你用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:55:21