Java中Switch Case字符转换失效问题排查:拉丁字符转西里尔字符时始终进入默认分支
问题分析与解决
首先明确说,toCharArray()不是问题,你遇到的核心问题是switch语句里每个case后面都没有加break!
为什么会一直进入default分支?
在Java的switch语句中,如果某个case匹配成功后没有break,程序会继续执行后续所有case(包括default)的代码,这叫“贯穿”(fall-through)。比如当匹配到case 'a'时,代码会先把d[i]设为'а',然后因为没有break,会继续执行case 'b'、case 'e'……直到最后执行default,把d[i]又改回了原字符c[i],看起来就像每次都进入了default分支。
修正后的代码
只需要在每个case的代码末尾加上break就可以解决问题,另外还可以去掉多余的强制转换:
public static void main(String[] args) { cyr("abcekmh".toLowerCase().toCharArray()); } private static void cyr(char[] c) { char[] d = new char[c.length]; for(int i = 0; i < c.length; i++) { switch(c[i]) { // c[i]本身就是char,无需强制转换 case 'a': d[i] = 'а'; break; case 'b': d[i] = 'в'; break; case 'e': d[i] = 'е'; break; case 'k': d[i] = 'к'; break; case 'm': d[i] = 'м'; break; case 'h': d[i] = 'н'; break; case 'i': d[i] = 'ı'; break; case 'o': d[i] = 'о'; break; case 'p': d[i] = 'р'; break; case 'c': d[i] = 'с'; break; case 't': d[i] = 'т'; break; case 'y': d[i] = 'у'; break; case 'x': d[i] = 'х'; break; default: d[i] = c[i]; break; // 加不加都可以,但加上更符合编码规范 } } for(char russian : d) { System.out.print(russian); } }
额外说明
toCharArray()完全没问题,它只是把字符串拆成字符数组,和你遇到的switch问题无关。- 运行修正后的代码,输入"abcekmh"会正确转换为对应的西里尔字符:
авсекмн。
内容的提问来源于stack exchange,提问作者gooooodmorning
相关产品推荐
相关产品推荐

