为何代码未触发异常?折扣码输入非法字符无报错提示
问题分析与修复方案
你的代码逻辑刚好写反了,这就是为什么永远不会抛出异常的核心原因!
原代码的关键问题
你当前的循环逻辑是:只要遍历到第一个合法字符(字母或$),就直接返回大写后的字符串,完全不会检查后续的字符。比如用户输入"A123",第一个字符A是合法的,代码直接return,根本不会看后面的123;哪怕输入"$$$!",前三个$都是合法的,代码在第一个$就返回了,不会处理最后的!。
修正后的代码
我们需要把逻辑反转:遍历所有字符,只要发现任何一个非法字符(既不是字母也不是$),就抛出异常;只有所有字符都合法时,才返回大写后的字符串。
private String normalizeDiscountCode(String discountCode) { // 先处理null的情况,避免调用toUpperCase时触发空指针异常 if (discountCode == null) { throw new IllegalArgumentException("Discount code cannot be null"); } String upperDiscountCode = discountCode.toUpperCase(); for (char c : upperDiscountCode.toCharArray()) { // 检查当前字符是否非法:不是字母,也不是$ if (!Character.isLetter(c) && c != '$') { throw new IllegalArgumentException("Discount code contains invalid character: " + c); } } // 所有字符都合法,返回大写后的优惠码 return upperDiscountCode; }
额外优化提示
- 在异常信息里带上具体的非法字符,能让用户更清晰地知道哪里出错了
- 提前处理
discountCode为null的情况,避免运行时出现未预期的NullPointerException
内容的提问来源于stack exchange,提问作者Romain Trost
相关产品推荐
相关产品推荐

