Java Switch语句匹配数组值时始终执行default分支问题排查
排查Switch总是走Default的问题
兄弟,我来帮你揪出这个问题的根源!你说数组里的值肯定是1-6,但switch却一直触发default分支,大概率是踩了这几个常见的坑:
1. 变量根本没拿到数组里的值
最容易忽略的一点:你是不是声明了switch用的变量,但没把数组元素赋值给它?比如像下面这种情况:
int chargeLevel; // 只声明没赋值,默认值是0 int[] chargeArr = {1,3,5}; // 漏了这行:chargeLevel = chargeArr[0]; switch(chargeLevel) { case 1: ... break; case 2: ... break; default: // 这里会被触发,因为chargeLevel是0 }
解决办法:在switch前加个打印语句,确认变量值:
System.out.println("当前switch变量值:" + chargeLevel);
如果输出不是1-6,那就是赋值环节出问题了。
2. 数据类型不匹配
这是高频踩坑点!比如你的数组是int[],但switch的变量是char类型——int的1和char的1(ASCII码是49)完全不是一回事,肯定匹配不上case 1。举个错误示例:
int[] chargeArr = {2,4,6}; char level = chargeArr[0]; // 这里int转char,2变成ASCII码对应的字符 switch(level) { case 2: // 这里的2是int类型,和char的level不匹配 ... break; default: // 触发default }
解决办法:确保switch变量和数组元素的类型完全一致,比如数组是int[]就用int变量,Integer[]用int或Integer变量,别混用char、String等其他类型。
3. Case语句写错了
别笑,真的有人会犯这种低级错误:
- case后面加了分号:
case 1;(正确应该是case 1:) - case的数字和数组值不对应:比如数组是1-6,但case写的是0-5
- 漏写了
break;(虽然漏写不会直接触发default,但会导致执行完当前case后继续跑后面的case,不过你说总是走default,这条概率低,但最好补上)
4. 自动拆箱的小坑(概率低)
如果你的数组是Integer[]包装类型,正常情况下int变量会自动拆箱匹配,但如果数组里不小心混入了null(虽然你说确认是1-6,但可以排查下),自动拆箱会抛出NPE,但如果没报错却走default,这条可能不适用,但可以确认下数组元素没有null。
按照上面的步骤排查,应该很快能找到问题!
内容的提问来源于stack exchange,提问作者Issame
相关产品推荐
相关产品推荐

