Herramientas de usuario

Herramientas del sitio


errores_comunes_con_beanshell

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
errores_comunes_con_beanshell [2010/12/29 13:00]
al-khwarizmi
errores_comunes_con_beanshell [2011/09/04 17:27] (actual)
al-khwarizmi
Línea 168: Línea 168:
 === Tipos de error comunes === === Tipos de error comunes ===
  
-Para quienes no se lleven bien con el inglés o no estén muy familiarizados con los mensajes que suelen dar los compiladores e intérpretes de lenguajes de programación,​ he aquí una recopilación de los mensajes de error más comunes que se pueden encontrar en BeanShell y qué significan:+Para quienes no se lleven bien con el inglés o no estén muy familiarizados con los mensajes que suelen dar los compiladores e intérpretes de lenguajes de programación,​ he aquí una recopilación de los mensajes de error más comunes que se pueden encontrar en BeanShell y qué significan. La inmensa mayoría de los errores que se cometen en BeanShell son de alguno de estos tipos, y se depuran muy fácilmente conociendo los mensajes:
  
 <​code>​Syntax error (...) Parse error at line 5, column 5.  Encountered:​ end</​code>​ <​code>​Syntax error (...) Parse error at line 5, column 5.  Encountered:​ end</​code>​
Línea 185: Línea 185:
  
 Se ha llamado a un método sobre una variable nula. Es decir, se ha hecho ''​variable.metodo()''​ cuando el valor de ''​variable''​ es ''​null''​. Éste es uno de los errores más comunes; pero también de los más fáciles de depurar, pues siempre significa esto, y no hay más que ir a la línea de código que se menciona y ver qué objeto aparece antes de un punto y es ''​null'',​ y ya está, arreglado. Se ha llamado a un método sobre una variable nula. Es decir, se ha hecho ''​variable.metodo()''​ cuando el valor de ''​variable''​ es ''​null''​. Éste es uno de los errores más comunes; pero también de los más fáciles de depurar, pues siempre significa esto, y no hay más que ir a la línea de código que se menciona y ver qué objeto aparece antes de un punto y es ''​null'',​ y ya está, arreglado.
 +
 +<​code>​java.lang.NullPointerException</​code>​ (pero sin lo de Null Pointer in Method Invocation)
 +
 +Este error se genera porque se ha llamado a algún método que por dentro ha invocado a su vez otro método sobre una variable ''​null''​. En la práctica, en una aventura de AGE esto casi siempre será porque hemos pasado un ''​null''​ como parámetro a una función o método que requiere parámetros no nulos. Por ejemplo, si hacemos algo como ''​String s = null; Item it = item(s);''​ se nos provocará este error porque hemos pasado el parámetro nulo a la función ''​item()''​.
 +
 +<​code>​Syntax error (...) Error in method invocation: ​
 +Method hasIteem( eu.irreality.age.Item ) not found in class'​eu.irreality.age.Player'</​code>​
 +
 +Este error se genera porque hemos invocado a un método que no existe. Nos puede pasar tanto porque nos hayamos equivocado en el nombre del método, como en sus parámetros (por ejemplo, un método que requiera un parámetro de un tipo, pero lo llamemos con un parámetro de otro tipo).
 +
 +El error es muy fácil de depurar porque el mensaje nos muestra exactamente (además de la línea en la que se ha producido) cuál es el nombre y los parámetros del método que hemos intentado llamar, y sobre qué clase. Por ejemplo, en este caso, la causa del error es que escribimos ''​hasIteem''​ en lugar de ''​hasItem''​. Por eso nos dice que no encontró el método ''​hasIteem( eu.irreality.age.Item )''​ en la clase ''​Player''​.
 +
 +<​code>​java.lang.ArrayIndexOutOfBoundsException</​code>​
 +
 +Esta excepción ocurre si hemos intentado acceder a una posición ilegal de un array. Por ejemplo, si tenemos un array de tamaño 7 e intentamos acceder a un índice mayor que seis, o menor que cero.
 +
 +<​code>​Error:​ java.lang.IndexOutOfBoundsException:​ Index: 3, Size: 3</​code>​
 +
 +Esta excepción es análoga a la anterior, pero para listas. Se nos informa del índice ilegal al que hemos intentado acceder (en este caso, ''​3''​) y el tamaño de la lista (también ''​3''​). Con esto, y la posición del error en el código, no deberíamos tener problema para depurar el fallo.
 +
 +=== Funcionalidad de depuración ===
 +
 +AGE incluye la siguiente funcionalidad para ayudar a localizar y corregir errores en las aventuras:
 +
 +== Impresión de información de depuración en los parseCommand ==
 +
 +Si ejecutamos el siguiente código:
 +
 +<code java>
 +Debug.setCodeDebugging(true);​
 +</​code>​
 +
 +los parámetros de todos los métodos parseCommand que se llamen desde nuestra aventura aparecerán impresos en la salida de error estándar (que se muestra por defecto en la consola en los scripts de AGE para Linux y Mac, o en un log en el script de Windows).
 +
 +== Debugger dinámico ==
 +
 +AGE dispone de un depurador o "​debugger"​ que permite evaluar expresiones BeanShell durante la ejecución de las aventuras. Se puede activar ejecutando el código
 +
 +<code java>
 +Debug.setEvalEnabled(true);​
 +</​code>​
 +
 +y una vez activado, podemos utilizar la orden especial "​eval"​ en la aventura para obtener el valor de una expresión BeanShell en cualquier momento del juego. Por ejemplo, podríamos hacer
 +
 +<​code>​
 +eval 1+1
 +eval get ( mobile("​jugador"​) , "​cansado"​ )
 +eval item("​puerta roja"​).isClosed()
 +eval mobile("​goblin"​).hasItem(item("​espada"​))
 +</​code>​
 +
 +y nos aparecerá por pantalla el valor de esas expresiones en ese momento.
 +
 +== Breakpoints ==
 +
 +Si queremos hacer una depuración de grano más fino, evaluando expresiones no sólo en los momentos en los que podemos introducir un comando sino en medio de la ejecución del código, podemos utilizar la funcionalidad de "​breakpoints"​ que proporciona AGE desde su versión 1.1.6b.
 +
 +Un breakpoint es un punto donde la ejecución de código (en este caso el código BeanShell) se pausa hasta que nosotros le indiquemos que continúe. Mientras la ejecución está pausada, podemos evaluar expresiones y ver qué valores toman las variables en ese punto de la ejecución.
 +
 +Para poner un breakpoint en nuestro código, sólo tenemos que ejecutar la función BeanShell
 +
 +<code java>​breakpoint();</​code>​
 +
 +O bien, si queremos darle un nombre al breakpoint para distinguirlo de otros,
 +
 +<code java>​breakpoint("​Nombre del breakpoint"​);</​code>​
 +
 +Cuando la ejecución del código llegue a ese punto, se nos mostrará una ventana donde podremos ver:
 +
 +  * El nombre del breakpoint en la barra de título (de este modo, si tenemos varios, podemos ver en cuál estamos parados en ese momento).
 +  * Un campo de texto donde podemos introducir una expresión o una sentencia o serie de sentencias BeanShell y evaluarlas como si se ejecutaran en ese punto del código, obteniendo debajo su valor. Nótese que si las sentencias cambian valores de variables o propiedades,​ estos cambios tendrán efecto en el código (es decir, si ponemos ''​i=1'',​ aparte de obtener el valor de esa expresión - que es 1 - también estaremos cambiando el valor de la variable en la ejecución).
 +  * Una lista de las variables locales que hay declaradas y sus valores. Nótese que, por un problema con BeanShell, en esta lista no se muestran los contadores declarados en la cabecera de los bucles ''​for''​. ​ Esto no debería ser un problema, ya que se pueden declarar dichos contadores como variables externas al bucle y entonces sí se mostrarán.
 +  * Un botón que nos permite continuar la ejecución, saliendo del breakpoint. ​
errores_comunes_con_beanshell.1293624032.txt.gz · Última modificación: 2010/12/29 13:00 por al-khwarizmi