Switch Java问题:caseexpression式必须是常量expression式

我在switch / case语句中遇到问题。 错误说:“Caseexpression式必须是常量expression式”。 我理解错误,我可以使用If来解决它,但是有人可以告诉我为什么case / case中的caseexpression式必须是常量。 我的错误代码示例:

public boolean onOptionsItemSelected(MenuItem item) { int idDirectory = ((MenuItem) findViewById(R.id.createDirectory)).getItemId(); int idSuppression = ((MenuItem) findViewById(R.id.recycleTrash)).getItemId(); int idSeeTrash = ((MenuItem) findViewById(R.id.seeTrash)).getItemId(); switch (item.getItemId()) { case idDirectory: createDirectory(currentDirectory); break; case idSuppression: recycleTrash(); break; case idSeeTrash: seeTrash(); break; } return super.onOptionsItemSelected(item); } 

Thx为您解释!

Solutions Collecting From Web of "Switch Java问题:caseexpression式必须是常量expression式"

所以可以在编译阶段进行评估(静态检查)

有关switch的正式定义,请参阅: http : //docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.11 。

此外,它可以帮助您更好地了解该switch如何转换为字节码:

 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; } } } 

编译之后:

 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 } 

看到那行标记为1:

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

它评估价值,并去其他行。 例如,如果值是9 ,它将跳转到指令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 

然后跳转到指令58:

  58: return 

所有这一切都是不可能的,如果它是dynamic评估。 这就是为什么。

在eclipse中IDE很简单,在切换语句CTRL + 1和转换切换语句 – if-else sentence http://tools.android.com/tips/non-constant-fields

idDirectory和其他需要是一个常量而不是一个声明的variables。 在这种情况下, Switch将无法工作,您需要切换到if-else结构。

编辑我看到OP的意思。 这只是如何开关在Java语言中工作。