Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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!

  • LocationManager's getBestProvider devolver null
  • Buen enfoque para reintentar manualmente solicitudes en Retrofit Android
  • ImageView ser un cuadrado con ancho dinámico?
  • Cómo manejar las cookies en httpUrlConnection usando cookieManager
  • Cómo instalar Android Market en el emulador para todos los api
  • Instalación de un apk en el emulador de Android en Mac OS
  • Permiso denegado (¿falta el permiso de INTERNET?): Pero se da permiso
  • Android: adjunta datos a las vistas
  • ¿Es posible tener múltiples tipos de letra en el mismo TextView?
  • Mensajería instantánea en Android con Google Cloud Messaging
  • Utilizar Pull to Refresh gridview en viewpager en Activity within ActivityGroup provoca ClassCastException
  • Android: Cargando una imagen desde la Web con Asynctask
  • 3 Solutions collect form web for “Un problema Java de conmutación: las expresiones de caso deben ser expresiones constantes”

    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.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.