为什么这些重复案件?

lam*_*ins 3 java string case char switch-statement

我正在尝试将用字母写的电话号码转换为真正的数字形式.我在for循环中有这个switch语句,它查看字符串的每个字符,但是eclipse说我有重复的情况('G'|'H'|'我','J'|'K'|' L','M'|'N'|'O')我不明白为什么?

switch(parts[1].charAt(i)){
   case 'A' | 'B' | 'C' : number.concat("2"); break; 
   case 'D' | 'E' | 'F' : number.concat("3"); break; 
   case 'G' | 'H' | 'I' : number.concat("4"); break; 
   case 'J' | 'K' | 'L' : number.concat("5"); break; 
   case 'M' | 'N' | 'O' : number.concat("6"); break; 
   case 'P' | 'Q' | 'R' | 'S' : number.concat("7"); break; 
   case 'T' | 'U' | 'V' : number.concat("8"); break; 
   case 'W' | 'X' | 'Y' | 'Z' : number.concat("9"); break; 
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*nus 6

好笑,我想我知道发生了什么.

执行此操作时'A' | 'B',您将对A和B 的字节值执行按位OR运算.您的IDE检测到一些结果值是等效的.这绝对不是你想要做的.

你想要的更像是:

case 'A':
case 'B':
case 'C':
    number.concat("2");
    break;
case 'D':
    [...]
Run Code Online (Sandbox Code Playgroud)

等等.

有关详细信息,请参阅http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html上的 "SwitchDemo2" .

验证(使用Python):

>>> ord('G') | ord('H') | ord('I')
79
>>> ord('J') | ord('K') | ord('L')
79
Run Code Online (Sandbox Code Playgroud)


Rei*_*eus 5

|代码中的字符代替按位OR运算符使用switch

switch(parts[1].charAt(i)){
    case 'A':
    case 'B':
    case 'C':
        number.concat("2");
    break;
    ...
Run Code Online (Sandbox Code Playgroud)

查看这些bytevalues的结果

System.out.println('G' | 'H' | 'I');
System.out.println('J' | 'K' | 'L');
Run Code Online (Sandbox Code Playgroud)

两者都打印79

引自JLS 14.11

与switch语句关联的两个case常量表达式中没有两个可能具有相同的值.

  • 这就是编译器抱怨的原因

阅读开关教程,了解如何使用穿透