Herramientas de usuario

Herramientas del sitio


errores_comunes_con_beanshell

¡Esta es una revisión vieja del documento!


Errores comunes con BeanShell

Con el material visto en las secciones anteriores, puedes experimentar creando aventuras básicas que utilicen código BeanShell. Como nadie es perfecto, esto seguramente te llevará a cometer algún error. Los errores en el código BeanShell suelen aparecer en forma de excepciones no capturadas, que se muestran en las partidas como un texto largo en rojo. He aquí un ejemplo:

Syntax error in BeanShell code in object: [ eu.irreality.age.Player:20000000:el character #3 ]
Loaded to call method onInit
(with no arguments)
File: inline evaluation of: ``void onInit() { set ( “prop” , number + 3 ); };

Stack trace: Sourced file: inline evaluation of: ``onInit( ); : illegal use of undefined variable, class, or 'void' literal : at
Line: 3 : in file: inline evaluation of: ``void onInit() { set ( “prop” , number + 3 ); };
: ) ;

Called from method: onInit : at Line: 1 : in file: inline evaluation of: ``onInit( ); : onInit ( )
at bsh.BSHBinaryExpression.eval(Unknown Source)
at bsh.BSHArguments.getArguments(Unknown Source)
at bsh.BSHMethodInvocation.eval(Unknown Source)
at bsh.BSHPrimaryExpression.eval(Unknown Source)
at bsh.BSHPrimaryExpression.eval(Unknown Source)
at bsh.BSHBlock.evalBlock(Unknown Source)
at bsh.BSHBlock.eval(Unknown Source)
at bsh.BshMethod.invokeImpl(Unknown Source)
at bsh.BshMethod.invoke(Unknown Source)
at bsh.BshMethod.invoke(Unknown Source)
at bsh.Name.invokeLocalMethod(Unknown Source)
at bsh.Name.invokeMethod(Unknown Source)
at bsh.BSHMethodInvocation.eval(Unknown Source)
at bsh.BSHPrimaryExpression.eval(Unknown Source)
at bsh.BSHPrimaryExpression.eval(Unknown Source)
at bsh.Interpreter.eval(Unknown Source)
at bsh.Interpreter.eval(Unknown Source)
at bsh.Interpreter.eval(Unknown Source)
at eu.irreality.age.ObjectCode.run(ObjectCode.java:197)
at eu.irreality.age.Mobile.execCode(Mobile.java:1394)
at eu.irreality.age.Mobile.constructMob(Mobile.java:1060)
at eu.irreality.age.Mobile.<init>(Mobile.java:193)
at eu.irreality.age.Player.<init>(Player.java:100)
at eu.irreality.age.World.loadWorldFromXML(World.java:810)
at eu.irreality.age.World.loadWorldFromStream(World.java:1416)
at eu.irreality.age.World.<init>(World.java:1502)
at eu.irreality.age.filemanagement.WorldLoader.loadWorldFromPath(WorldLoader.java:35)
at eu.irreality.age.filemanagement.WorldLoader.loadWorld(WorldLoader.java:150)
at eu.irreality.age.swing.sdi.SwingSDIInterface$LoaderThread.run(SwingSDIInterface.java:270)

Cause report: [no exception]

Cuando nos encontremos un error como éste, es importante saber interpretar (aunque sea aproximadamente) el mensaje, que nos dirá qué tipo de error es y dónde está. Esto facilita mucho el proceso de arreglar los fallos.

Para ver cómo lo interpretamos, analicemos el mensaje:

Syntax error in BeanShell code in object: [ eu.irreality.age.Player:20000000:el jugador ]

Esta primera línea nos está diciendo en qué campo de código se ha encontrado el error. En este caso, el error está en el código del jugador.

Loaded to call method onInit
(with no arguments)

Esto nos dice cuál es el método que ha causado el error: en este caso, el método onInit() del jugador. Se nos aclara también que el método no tiene argumentos (parámetros), si los tuviera aparecerían aquí.

File: inline evaluation of: ``void onInit() { set ( “prop” , number + 3 ); };

Esto nos proporciona todo el código que dio el error, o un resumen. No suele ser muy útil porque el resto de información es más detallada, pero puede ayudarnos a hacernos una composición de lugar.

Stack trace: Sourced file: inline evaluation of: ``onInit( ); : illegal use of undefined variable, class, or 'void' literal : at Line: 3 : in file: inline evaluation of: ``void onInit() { set ( “prop” , number + 3 ); }; : ) ;

Esto, en cambio, es muy útil: nos dice en qué línea del campo de código se ha encontrado el error (en este caso, en la línea 3); y qué es el error exactamente (en este caso, “uso ilegal de variable, clase o literal void no definido”). Efectivamente, el error es que en la línea 3 hemos utilizado una variable, number, que no habíamos declarado.

Called from method: onInit : at Line: 1 : in file: inline evaluation of: ``onInit( ); : onInit ( )

at bsh.BSHBinaryExpression.eval(Unknown Source)\\

(…) La primera línea de esta parte nos vuelve a repetir que el error estaba en el método onInit()'' y nos dice en qué línea empieza el método. A continuación, viene un volcado de la pila en el momento del error. Esto normalmente no resultará muy útil, al menos para un uso básico de AGE. Pero si alguna vez se produce un error que no sea culpa vuestra sino de algún bug interno de AGE (esperemos que no; pero nadie es perfecto :)) seguramente el autor de AGE os pida que le mandéis esta información de la pila para localizar el fallo interno.

errores_comunes_con_beanshell.1293392115.txt.gz · Última modificación: 2010/12/26 20:35 por al-khwarizmi