After reading some of the SCJP certification last night, I got thinking about switch statements and how the expressions are evaluated, and I'm a little puzzled by something.
Java won't let you switch on a boolean, so the following will not compile :
public static void switchOnBoolean(boolean theBool)
{
System.out.println("\n\nAssessing boolean :" + theBool);
// line below won't compile, since booleans are not valid for the switch statement
switch(theBool)
{
case true:
{
System.out.println("The boolean was true");
break;
}
case false:
{
System.out.println("The boolean was false");
}
}
}
However, the compiler will not complain if you attempt to use an expression that evaluates to a boolean value in a case block, such as :
public static void switchOnChar(char theChar)
{
System.out.println("\n\nAssessing char : " + theChar);
switch(theChar)
{
case 'a':
{
System.out.println("The char was a");
break;
}
case 'b':
{
System.out.println("The char was b");
break;
}
case ('c' | 'd'):
{
System.out.println("The char was c or d");
break;
}
default:
{
System.out.println("The char didn't match anything, must be something else");
}
}
}
Ultimately, I can't ever get into the case ('c' | 'd')
since it would presumably evaluate to a boolean...
So my question is:
- Why is it legal to use something like
('c' | 'd')
? - How could that ever be useful, since that would be unreachable
- If you ever wanted to case on more than one value, but without using a default, is your only choice to re-implement as an if-else statement?
g
;) TrySystem.out.println((char) ('c' | 'd'));
– Tepefy'c' & 'd'
which matches ` or 'c' + 'd' which matches Ç and 'c'/'d' matches the nul byte \0 ;) – Tepefy