CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 19 Dic 2018 03:06

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 8 mensajes ] 
Autor Mensaje
NotaPublicado: 16 Feb 2011 08:47 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
No entiendo porqué se produce este error con el siguiente código.
Se supone que esa línea sólo debería leerse en el caso de que el personaje lleve puesto el sombrero ¿no?


Syntax error in BeanShell code in object: [ eu.irreality.age.Wearable:30000035:el sombrero ]
Loaded to call method parseCommandGeneric
With arguments: [ eu.irreality.age.Player:20000001:el Guerrero ] dejar sombrero [ eu.irreality.age.Wearable:30000035:el sombrero ] null true


if(equals(verb,"dejar") && get( item("cabeza") , "wears" , item("sombrero") ) )

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
NotaPublicado: 16 Feb 2011 08:52 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
He comprobado que si quito ese bloque, el sombrero parece funcionar correctamente, la pregunta es ¿por qué lo puse pues? :roll:

Empiezo a pensar que esta aventura se me ha ido de las manos. :cry:

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
NotaPublicado: 16 Feb 2011 08:55 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5304
Ubicación: Coruña
Ponme más información del error, la línea donde aparecen fila, columna y en qué consiste el error; y lo que hay en esa línea. Las líneas de error que me has puesto no son las que dan información "de verdad", y la línea de código que me has puesto no creo que sea la que contiene el error.

Si pone syntax error seguro que es una chorrada, como un punto y coma de menos, un paréntesis de más o algo así, pero en lo que hay que fijarse más es en la línea que pone "in line nosequé, column nosecuánto"...

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
NotaPublicado: 16 Feb 2011 09:31 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
File: inline evaluation of: ``//sombrero void parseCommandGeneric ( Mobile aCreature , String verb , Strin . . . ''
Stack trace: Sourced file: inline evaluation of: ``parseCommandGeneric( arg0, arg1, arg2, arg3, arg4, arg5, arg6);'' : illegal use of null value or 'null' literal : at Line: 58 : in file: inline evaluation of: ``//sombrero void parseCommandGeneric ( Mobile aCreature , String verb , Strin . . . '' : ) {

Es el error, que ha encontrado Gizmo.

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
NotaPublicado: 16 Feb 2011 09:59 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5304
Ubicación: Coruña
Ah, ya veo lo que es. Esto es algo que ya hablamos hace tiempo; pero igual no te acuerdas.

No sé si te acuerdas que hay dos formas de consultar una relación:

- La clásica, con métodos donde se especifica el tipo de dato, que si no recuerdo mal (estoy en el trabajo, no tengo aquí el AGE) se pone así:

item("cabeza").getRelationshipPropertyValueAsBoolean( item("sombrero") , "wears" )

Ahí le estamos diciendo qué tipo de dato esperamos (un boolean) y entonces siempre devolverá true o false. Si nunca se ha fijado explícitamente un valor para la relación, devolvería el valor por defecto, que es false.

- La de conveniencia, donde no se especifica el tipo de dato, que es la que has usado:

get ( item("cabeza") , "wears" , item("sombrero") )

Ésta es más corta pero tiene el inconveniente de que como no le especificas que quieres que te devuelva un booelan, AGE no puede deducir por defecto de qué tipo quieres que sea esa relación.

Por supuesto, en el caso de que a esa relación se le haya dado un valor (ya la has puesto a true o false), entonces no hay problema.
getRelationshipPropertyValueAsBoolean
Pero si a esa relación no se le ha dado un valor, AGE no sabe si lo que quieres obtener es un entero, un boolean, un String, etc. Por lo tanto, en este caso, devuelve null, y es ilegal poner un null como condición de un if (de ahí que te diga "uso ilegal de valor null").

En este caso el problema se dará si dejas el sombrero sin habértelo puesto antes. Si te has puesto el sombrero, la relación ya tiene un valor (true si sigues con él o false si te lo has quitado) y por lo tanto no se devolverá null.

Por lo tanto, hay tres soluciones posibles para esto:

1. Comprobar que la relación no sea null:

Código:
if(equals(verb,"dejar") && get( item("cabeza" , "wears" , item("sombrero") ) != null && get( item("cabeza") , "wears" , item("sombrero") ) ) ,
,,

2. (más sencilla, creo yo). Dejar el código tal cual está, sin cambios, pero poner inicialmente (por ejemplo en el metodo intro) la relación explícitamente a false, para que no valga null:

Código:
set ( item("cabeza") , "wears" , item("sombrero") , false );


3. Usar el método "clásico", getRelationshipPropertyValueAsBoolean.

Con cualquiera de esas tres cosas (yo creo que la más sencilla es la segunda) resolverás el error.

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
NotaPublicado: 16 Feb 2011 10:09 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
2. (más sencilla, creo yo). Dejar el código tal cual está, sin cambios, pero poner inicialmente (por ejemplo en el metodo intro) la relación explícitamente a false, para que no valga null:

Código:
set ( item("cabeza") , "wears" , item("sombrero") , false );





Sí, es la más simple porque además no es el único sitio donde hago esa comprobación.
Lo malo será que haya mas casos similares en los que no haya asignado valor alguno a otras propiedades... Esperemos que no... :|

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
NotaPublicado: 16 Feb 2011 10:46 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5304
Ubicación: Coruña
En general siempre que uno usa los métodos de conveniencia para acceder a propiedades y relaciones, hay que inicializarlas, si no devolverán null.

Yo no creo que haya muchos más problemas parecidos porque me parece que para las propiedades ya lo has hecho (ya estabas concienciada por bugs anteriores que salieron durante el desarrollo :D) y sólo no lo habrás hecho para las relaciones; pero relaciones usas muy poquitas (tal vez sólo ésa).

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
NotaPublicado: 16 Feb 2011 19:01 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 24 Ago 2007 00:41
Mensajes: 2023
Ubicación: Chile
Oigan, déjense de "wears"!!

:lol: :lol: :lol: :lol: :lol:

_________________
Eliuk Blau
eliukblau (AT) gmail.com
http://www.caad.es/eliukblau/


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 8 mensajes ] 

Todos los horarios son UTC + 1 hora


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro

Buscar:
Saltar a:  
cron
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpBB-Es.COM