Java校验4字符double literal代码输入合法值仍触发else分支问题求助
代码错误原因
- 你的
isValid方法最终返回条件强制要求输入的4位字符串必须包含且仅包含1个小数点,输入2222无小数点,decimalCount值为0,自然返回false触发else分支,这是核心问题。 - 长度不等于4的输入比如
222222222,会被第一行的长度校验直接拦截返回false,走else分支属于正常逻辑。 - 当前校验逻辑未覆盖Java官方double字面量的合法格式,比如
123d、-45D这类带合法后缀的4位double字面量,也会被判定为不合法。
修复方案
如果你认可纯4位数字、带小数点的4位浮点数、带d/D后缀的4位格式都属于合法输入,可以将isValid方法修改为如下内容:
public static boolean isValid(String s) { if (s.length() != 4) return false; String digits = "0123456789"; // 首字符校验:支持正负号、数字 if (s.charAt(0) != '+' && s.charAt(0) != '-' && digits.indexOf(s.charAt(0)) == -1) return false; int decimalCount = 0; boolean hasValidSuffix = false; for (int i = 1; i < 4; i++) { char cur = s.charAt(i); if (cur == '.') { decimalCount++; if (decimalCount > 1) return false; } else if (cur == 'd' || cur == 'D') { // d/D后缀只能出现在最后一位 if (i != 3) return false; hasValidSuffix = true; } else if (digits.indexOf(cur) == -1) { return false; } } // 合法条件:要么有1个小数点,要么带合法后缀,要么是纯4位数字 return decimalCount == 1 || hasValidSuffix || (decimalCount == 0 && !hasValidSuffix); }
如果你原本的规则就是要求合法4位double必须带小数点,那输入2222触发else属于正常逻辑,只需要调整输入提示,告知用户需要输入带小数点的4位内容即可。
内容的提问来源于stack exchange,提问作者bytech2
相关产品推荐
相关产品推荐

