Un problema Java de conmutación: las expresiones de caso deben ser expresiones constantes
Tengo un problema en mi declaración de switch / case. El error dice: "Las expresiones de caso deben ser expresiones constantes". Entiendo el error y puedo resolverlo usando If pero alguien puede decirme porqué la expresión del caso debe ser constante en un interruptor / caso. Un ejemplo de código de mi error:
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 para su explicación!
- ¿Puede utilizar declaraciones condicionales en el caso de conmutación en Android?
- Solicitud de switch / case con boolean
- ¿Cómo iniciar una actividad diferente usando la caja de conmutación en el elemento de menú?
- ¿Usando cuerdas en una caja de conmutación para un menú?
- Obteniendo la instancia Switch dentro de ActionBar
- Diferenciar los diálogos individuales con DialogInterface.OnClickListener
- Android Studio no me deja usar el interruptor en una cadena?
- Cambiar los conmutadores a declaraciones "if-else"
- Widget de conmutador vertical Android
- Cobertura de Jacoco para la declaración de switch
- Android: El botón OnClickListener no funciona
- Ocultar texto predeterminado para el botón de Android
- Cómo cambiar entre la cámara delantera y trasera cuando se utiliza MediaRecorder android
Por lo tanto, se puede evaluar durante la fase de compilación (verificación estática)
Vea: http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.11 para una definición formal del switch
.
Además, puede ayudarle a comprender mejor cómo se transforma este switch
en 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; } } }
Y después de compilar:
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 }
Vea esa línea marcada como 1:
1: lookupswitch{ //2 1: 28; 9: 39; default: 50 }
Evalúa el valor y va a alguna otra línea. Por ejemplo, si el valor es 9
, saltará a la instrucción 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
Que a su vez salta a la instrucción 58:
58: return
Todo esto no sería posible si se evaluara dinámicamente. Es por eso.
En eclipse IDE es simple, en cambiar la oración CTRL + 1 y convertir la sentencia switch – if-else frase http://tools.android.com/tips/non-constant-fields
El idDirectory
y otros necesitan ser una constante y no una variable declarada. Switch
no funcionará en este caso, necesita cambiar a if-else
construct.
EDITO Veo lo que significaba OP. Así es como funciona el conmutador en lenguaje java.
- ¿Cómo mostrar la salida console.log () en la aplicación PhoneGap utilizando Eclipse y HTC Desire HD?
- Cómo obtener la información de conexión wifi actual en android