A Switch Java problem : case expressions must be constant expressions

前端 未结 3 584
日久生厌
日久生厌 2020-12-08 10:32

I having a problem in my switch/case statement. The error says : \"Case expressions must be constant expressions\". I understand the error and I can resolve it using If but

相关标签:
3条回答
  • 2020-12-08 10:52

    The idDirectory and others need to be a constant and not a declared variable. Switch will not work in this case, you need switch to if-else construct.

    EDIT I see what OP meant. That is just how switch works in java language.

    0 讨论(0)
  • 2020-12-08 11:11

    So it can be evaluated during the compilation phase ( statically check )

    See: http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.11 for a formal definition of the switch.

    Additionally it may help you to understand better how that switch is transformed into bytecode:

    class Switch {
      void x(int n ) {
        switch( n ) {
          case 1: System.out.println("one"); break;
          case 9: System.out.println("nine"); break;
          default:  System.out.println("nothing"); break;
        }
      }
    }
    

    And after compiling:

    C:\>javap -c Switch
    Compiled from "Switch.java"
    class Switch extends java.lang.Object{
    Switch();
      Code:
       0:   aload_0
       1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
       4:   return
    
    void x(int);
      Code:
       0:   iload_1
       1:   lookupswitch{ //2
                    1: 28;
                    9: 39;
                    default: 50 }
       28:  getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
       31:  ldc     #3; //String one
       33:  invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
       36:  goto    58
       39:  getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
       42:  ldc     #5; //String nine
       44:  invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
       47:  goto    58
       50:  getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
       53:  ldc     #6; //String nothing
       55:  invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
       58:  return
    
    }
    

    See that line marked as 1:

     1:   lookupswitch{ //2
                1: 28;
                9: 39;
                default: 50 }
    

    It evaluates the value and goes to some other line. For instance if value is 9 it will jump to instruction 39:

       39:  getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
       42:  ldc     #5; //String nine
       44:  invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
       47:  goto    58
    

    Which in turn jumps to instruction 58 :

       58:  return
    

    All this wouldn't be possible if it was evaluated dynamically. That's why.

    0 讨论(0)
  • 2020-12-08 11:12

    in eclipse IDE is simple ,in switch sentence CTRL + 1 and convert switch sentence - if-else sentence http://tools.android.com/tips/non-constant-fields

    0 讨论(0)
提交回复
热议问题