El depurador de Android Studio resalta las líneas incorrectas

No puedo ver nada funcionalmente incorrecto en términos de lo que se ejecuta, pero desperdicié una hora probando mi código y el comstackdor está haciendo lo que deberían.

Considera este código:

public int getAnswer(int a) { int retval = 18; int x = 25; int y = 50; while (a-- > 0) { if (a == 3) { retval = a; return retval; } } x = 10; y = 20; return 0; } 

Llamado con

 int theAnswer = getAnswer(6); 

Punto de interrupción tanto de las líneas que contienen return como antes de ejecutar el código, intente y pronostique el resultado y, por lo tanto, qué línea se golpeará.

Como se puede imaginar por el tono de mi pregunta, se resalta la línea incorrecta, pero se devuelve el resultado correcto. Si revisas el código, baila bastante.

¿Hay algo que se pueda configurar de manera diferente para que se muestren las líneas correctas? (Estoy usando el último Android Studio, que aprecio que es potencialmente inestable, pero estoy seguro de que he visto un comportamiento similar en Eclipse hace un tiempo, pero nunca pasé el tiempo buscándolo, tal vez es algo de Java) .

Este es un problema con dx, que es la parte de la comstackción que convierte sus archivos Java .class en archivos .dx para empaquetarlos en Android. De acuerdo a esto:

https://code.google.com/p/android/issues/detail?id=34193

si una función tiene múltiples rutas de retorno, dx fusiona la instrucción de retorno en una sola instrucción de retorno, por lo que durante la depuración, el depurador no puede decir a qué línea pertenece una devolución y las cosas saltan. Esto corresponde a lo que veo cuando trato de reproducir su problema: cada vez que pasa por el ciclo, hace la comprobación if (a == 3) , salta al return 0 al final y luego salta de regreso al ciclo. Está viendo que la última return 0 se fusionó con la return retval del return retval en el medio del ciclo.

Dudo que esto se solucione en el corto plazo, por lo que puede que tengas que aprender a vivir con él. Lo siento, sé que es un poco loco.

Pruebe Build -> Rebuild project y luego Shift + F9. Tiene un código obsoleto ejecutándose en la aplicación.

Esto es lo que funcionó para mí, al menos para acceder al código fuente de Android SDK:

  1. Instale la plataforma SDK y las fonts para Android SDK exactamente para el nivel API de la versión de Android que está ejecutando durante el desarrollo (use la página del historial de versiones de Android para averiguar qué nivel API tiene su dispositivo).
  2. Comstack tu aplicación exactamente para esa versión. Por ejemplo, en Android Studio, abra el archivo build.gradle su aplicación y establezca el valor de compileSdkVersion consecuencia.
  3. Depure su aplicación. Cuando ingrese a la fuente de Android SDK, debería ver la línea correcta.
  4. (opcional) Vuelva a comstackr con el último SDK antes de implementarlo. En otras palabras, cambie compileSdkVersion nuevo.