Java代码疑问:运行后i=5,case 'c'|'d'不可达且数组元素未处理
Java switch分支未处理数组元素、case不可达问题分析
运行给定代码后,数组中的'c'和'd'元素未被处理,case 'c'|'d'分支实际不可达,最终i=5,核心原因有两点:
原始代码
var ca = new char[]{'a', 'b', 'c', 'd'}; var i = 0; for (var c : ca) { switch (c) { case 'a': i++; System.out.println("Case a : " + c + " : " + i); case 'b': ++i; System.out.println("Case b: " + c + " : " + i); case 'c'|'d' : i++; System.out.println("Case c or d : "+c + " : "+i); } } System.out.println(i);
运行输出
Case a : a : 1 Case b: a : 2 Case c or d : a : 3 Case b: b : 4 Case c or d : b : 5 5
问题原因
1. case 'c'|'d'写法错误,无法匹配'c'或'd'
Java的switch case标签必须是单个常量表达式,'c'|'d'是对两个字符做位或运算:
'c'的ASCII值为99,'d'为100- 位或运算结果为103,对应字符
'g'
也就是说这个case实际是匹配'g',而非'c'或'd'。当循环到'c'和'd'时,switch找不到匹配分支,自然不会执行任何代码。
2. 缺少break导致代码贯穿
每个case分支末尾没有break语句,会触发switch的贯穿行为:
- 处理
'a'时,执行完case 'a'后,会继续执行case 'b'和case 'g'的代码,i从0涨到3 - 处理
'b'时,执行完case 'b'后继续执行case 'g'的代码,i从3涨到5 - 处理
'c'和'd'时无匹配分支,i不再变化,最终输出5
修正方案
要匹配'c'或'd',需将它们拆分为两个case标签(可共用代码块),同时添加break避免贯穿:
var ca = new char[]{'a', 'b', 'c', 'd'}; var i = 0; for (var c : ca) { switch (c) { case 'a': i++; System.out.println("Case a : " + c + " : " + i); break; case 'b': ++i; System.out.println("Case b: " + c + " : " + i); break; case 'c': case 'd': i++; System.out.println("Case c or d : " + c + " : " + i); break; } } System.out.println(i);
修正后输出
Case a : a : 1 Case b: b : 2 Case c or d : c : 3 Case c or d : d : 4 4
内容的提问来源于stack exchange,提问作者Zarna Chirag
相关产品推荐
相关产品推荐

