Java实现凯撒密码的程序运行返回空字符串该如何解决?
问题根因
你代码中存在的语法使用错误直接导致循环没有执行,最终返回空字符串:
- Java 中
String类型获取长度需要调用无参方法length(),你写的cipher.length是数组类型获取长度的写法,该写法对于String参数来说编译阶段就会报错。如果你反馈代码可以正常编译,说明你实际运行的代码要么参数类型被误定义为char[],要么循环判断条件被误写为永远不成立的逻辑,导致for循环一次都没有执行,空的StringBuilder直接转为空字符串返回。
修复方案
- 把for循环的判断条件修改为
index < cipher.length() - 可选优化:你当前对数字的处理逻辑会导致数字偏移超过9之后变为符号字符,如果需要数字也实现循环偏移,需要和字母逻辑保持一致做取模处理
- 可选兼容:如果需要支持负偏移量,可以在取模前补对应进制的数值(字母补26、数字补10),避免取模得到负数
修复后的完整代码
public static String caesarCipher (String cipher, int shiftAmount) { StringBuilder str = new StringBuilder(); // 修正长度获取方式 for (int index = 0; index < cipher.length(); index = index + 1 ){ char letter = cipher.charAt(index); if (Character.isUpperCase(letter)){ // 加26再取模兼容负偏移 letter = (char)(((int) letter - 'A' + shiftAmount + 26) % 26 + 'A'); } else if (Character.isLowerCase(letter)){ letter = (char)(((int) letter - 'a' + shiftAmount + 26) % 26 + 'a'); } else if (Character.isDigit(letter)){ // 数字循环偏移处理,加10兼容负偏移 letter = (char)(((int) letter - '0' + shiftAmount + 10) % 10 + '0'); } str.append(letter); } return str.toString(); }
测试验证
调用HW2.caesarCipher("Character", 1)即可得到预期输出Dibsbdufs。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

