Java实现mal字符串屏蔽程序输入末尾含m时运行异常求助
问题根源
你的代码运行报错是数组下标越界导致的:
遍历字符数组时,循环终止条件设为了i < dizi.length,当i已经走到数组最后1位或倒数第2位时,后续访问dizi[i+1]、dizi[i+2]的操作已经超出了数组的有效下标范围,当输入内容以m结尾时,i走到最后一位刚好命中dizi[i] == 'm'的判断,触发后续的越界访问直接抛出异常。
修复方法
只需要调整循环的终止条件即可,因为要匹配连续3个字符,i的最大有效取值为数组长度-3,超出这个范围不可能凑出3个连续字符,不需要再遍历。
修改后的完整代码如下:
import java.util.Scanner; public class mute { public static void main(String[] args) { Scanner scan = new Scanner(System.in); String enteredmessage; System.out.print("Enter the message:"); enteredmessage = scan.nextLine(); char[] array = enteredmessage.toCharArray(); mutecommand(array); scan.close(); } public static void mutecommand(char[] dizi) { // 调整循环终止条件,避免越界 for (int i = 0; i <= dizi.length - 3; i++) { if(dizi[i] == 'm' && dizi[i+1] == 'a' && dizi[i+2]=='l') { dizi[i]='*'; dizi[i+1]='*'; dizi[i+2]='*'; } } for (char a : dizi) { System.out.print(a); } } }
优化提示
如果需要匹配多个重叠的mal组合(极端场景如mmal),也可以在匹配到mal后让i直接跳过2位,避免重复判断已经替换为*的字符,提升执行效率。
内容的提问来源于stack exchange,提问作者TarikTEM
相关产品推荐
相关产品推荐

