Case expressions must be constant expressions for static final int?
Solution 1
Replace
case MorrisBoard.RING.OUT:
with
case Ring.OUT:
So this will really be a constant as in "determined at compilation".
The specification precises that a "SwitchLabel" must be
-
case
followed by a constant expression -
case
followed by the name of an enum value - or
default
What is considered a valid constant expression is described here in the specification. It's fairly limited.
Solution 2
Simple solution for this problem is : Click on the switch and then press CTL+1, It will change your switch to if-else block statement, and will resolve your problem
![Admin](/assets/logo_square_200-5d0d61d6853298bd2a4fe063103715b4daf2819fc21225efa21dfb93e61952ea.png)
Admin
Updated on March 23, 2020Comments
-
Admin over 4 years
I have a
final class Ring
defined as:final class Ring { public static final int OUT = 3; public static final int MID = 2; public static final int IN = 1; }
I also have a
public class MorrisBoard
with the following code:public class MorrisBoard { public static final Ring RING = new Ring(); private boolean checkMillBy(int ring, int x, int y) { switch(ring) { case MorrisBoard.RING.OUT: //... case MorrisBoard.RING.MID: //etc. //... } return false; }
MorrisBoard.RING.OUT
references a variable which is immutable for the lifetime of the program. All values are final.However, I still get the following error:
case expressions must be constant expressions
. I'm confused by this -MorrisBoard.RING.OUT
is a constant expression.What is going on here?
-
Hurda over 11 yearsDo you thing this will work when final class Ring is not static?
-
Admin over 11 yearsIn this particular case, it is, so this is an appropriate answer (thank you!). However, I would be curious to know how that would be handled.
-
Denys Séguret over 11 years@Hurda If you can't refer to your externally defined constant simply with
TypeName.Identifier
, then it's not valid. -
JGFMK over 2 yearsBTW: This works for Spring Tool Suite - based on Eclipse IDE. Not sure if this works for IntelliJ or Netbeans the same way.