You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 08:36:13