Ir al contenido

publicidad
publicidad

Foto

Problema con NullReference


Este tema ha sido archivado. Esto significa que no puedes responder en este tema.
9 respuestas en este tema

  • Btc

  • Adramalech

  • vida restante: 100%
  • Registrado: 15 oct 2007
  • Mensajes: 1.932
#1

Escrito 10 agosto 2009 - 20:48

Amigos, necesito una ayudita con esto. Programa en VB.NET 2008, y esta vez no consigo entender, por qué me sale esta excepción.

No se controló System.NullReferenceException
Message="Referencia a objeto no establecida como instancia de un objeto."


Corresponde al siguiente código:

[code:1]Dim nuevaposicion As sCuadritos

If movimiento = MovimientosPersonaje.Movimientos.Arriba Then

If (Cuadritos(vJugador.jPosicion.X, vJugador.jPosicion.Y + 1).relleno = MapaTipo.tipos.Edificio) = False Then '<--- AQUI DA EL FALLO

nuevaposicion.posicion = Cuadritos(vJugador.jPosicion.X, vJugador.jPosicion.Y + 1).posicion

End If

End If[/code]

Tanto en la parte que esta en negrita como en lo siguiente, salta esta excepcion. Puede que sea una fallo mío por la forma en declarar las variables y estructuras, por eso pongo aquí la estructura Cuadritos que se puede ver en el IF: [AVISO: Cuadritos es una variable del tipo sCuadritos que muestro aqui)

[code:1] Structure sCuadritos

Dim posicion As Point
Dim relleno As MapaTipo.tipos
Dim imagen As Bitmap

End Structure[/code]

Y también el MapaTipo, que podéis ver tanto en este codigo como el anterior:

[code:1]Public Class MapaTipo

Enum tipos

Vacio
Hierba
Edificio
Personaje

End Enum

End Class[/code]

Espero que me podáis echar una mano, porque yo ya no se que hacer con esto. Si hacen falta más datos, pidanlo por favor.

Un saludo, Btc

  • Ellolo17

  • Zodiark

  • vida restante: 100%
  • Registrado: 16 nov 2006
  • Mensajes: 6.208
#2

Escrito 10 agosto 2009 - 21:11

If (Cuadritos(vJugador.jPosicion.X, vJugador.jPosicion.Y + 1).relleno = MapaTipo.tipos.Edificio) = False Then '<--- AQUI DA EL FALLO


Una cosa, que yo recuerde no puedes comparar asi los datos.

Lo que haces es asignar a Cuadritos(vJugador.jPosicion.X, vJugador.jPosicion.Y + 1).relleno el valorde MapaTipo.tipos.Edificio
y luego ver si es false. Al menos eso es lo que entiendo yo al leer el codigo.

Prueba a comprobar primero una cosa y luego anidar dentro otro if donde compares si es false eso.

Creo que ese es el fallo ;)

Un saludo.

  • Btc

  • Adramalech

  • vida restante: 100%
  • Registrado: 15 oct 2007
  • Mensajes: 1.932
#3

Escrito 10 agosto 2009 - 21:21

Nada, eso ya lo habia probado y no funciona. Habia suprimido el = False, aunque solo fuese por ver si se saltaba el If (al no ser Edificio el valor que comparo, que en este caso ya se lo que es), pero sigue dando el mismo error:

[code:1]If Cuadritos(vJugador.jPosicion.pos1, vJugador.jPosicion.pos2 + 1).relleno = MapaTipo.Tipos.Edificio Then[/code]

Debe de ser por otro motivo, porque por ejemplo, ese nuevo codigo. Pos1 y pos2 son integer. Pues hago esto:

[code:1]vJugador.jPosicion.X = 0[/code]

Y me salta el mismo error!! Eso es rarisimo joder :S No lo entiendo. Esto esta declarado de la siguiente forma, para que puedas verlo:

[code:1]Public Class Jugador

Structure sPosicion

Public X As Integer
Public Y As Integer
Public Mapa As String
Public pos1 As Integer
Public pos2 As Integer

End Structure

'Datos Generales

Public jNombre As String 'guarda su nombre
Public jTipo As String 'Tio o tia

'Posicion

Public jPosicion As sPosicion[/code]

Ahi en el ultimo lugar, jPosicion, es donde lo declaro. Como puedes ver esto es otra clase, así que en el formulario donde esta el otro codigo lo que hay declarado es:

[code:1] Dim vJugador as Jugador[/code]

No entiendo lo que pasa la verdad :S

Un saludo, Btc

  • Btc

  • Adramalech

  • vida restante: 100%
  • Registrado: 15 oct 2007
  • Mensajes: 1.932
#4

Escrito 10 agosto 2009 - 21:27

Vale vale, SOLUCIONADO! La solucion esta, lo que no entiendo es porqué hay que hacerlo así y no de otra forma. Yo lo tenia declarado como:

Dim vJugador as Jugador

y se ha solucionado al ponerlo como:

Dim vJugador as New Jugador

Lo que no entiendo es por qué, pero bueno :S

Un saludo, Btc

#5

Escrito 10 agosto 2009 - 21:38

Dim vJugador as Jugador

y se ha solucionado al ponerlo como:

Dim vJugador as New Jugador

Lo que no entiendo es por qué, pero bueno :S

Dentro de los casi nulos conocimientos de programación que tengo, lo comprendo como crear un nuevo objeto (ahí que sea "new") de una clase ya existente.

Imagen Enviada
¡Lee y vota los mejores relatos de terror (y sandwiches) de Gamefilia!



  • Btc

  • Adramalech

  • vida restante: 100%
  • Registrado: 15 oct 2007
  • Mensajes: 1.932
#6

Escrito 10 agosto 2009 - 21:41

Dim vJugador as Jugador

y se ha solucionado al ponerlo como:

Dim vJugador as New Jugador

Lo que no entiendo es por qué, pero bueno :S

Dentro de los casi nulos conocimientos de programación que tengo, lo comprendo como crear un nuevo objeto (ahí que sea "new") de una clase ya existente.

Imagen Enviada
¡Lee y vota los mejores relatos de terror (y sandwiches) de Gamefilia!


No esta tan claro, al menos para mi. La disyuntiva entre el bien y el mal es:

Dim prueba as string

¿Por qué no a New String? Si pones New, el compilador te dirá que la clase String no tiene ningún constructor. Sin embargo, hay cosas como los dataset, que si pongo New. En este caso lo comprendo, ya que es un control, pero en este otro caso, no :S

Un saludo, Btc

  • Ellolo17

  • Zodiark

  • vida restante: 100%
  • Registrado: 16 nov 2006
  • Mensajes: 6.208
#7

Escrito 10 agosto 2009 - 21:50

Bueno, antes que nada para que lo tengas algo mas claro, la parte que comprueba si la casilla a la que se va a mover esta ocupada o no yo la pondria como una funcion porque la vas a tener que llamar 4 veces -una por cada movimiento-

ahora necesitaria ver la declaracion de cuadritos -la variable, la estructura ya veo como la tienes definida-

Y ver si has declarado la variable MapaTipo que usas en MapaTipo.Tipos.Edificio porque tiene el mismo nombre que la clase MapaTipo -posiblemente aqui este el fallo, que yo recuerde es un nombre reservado. Al declararlo ponle algun otro nombre como vMapaTipo. Aunque yo sinceramente no habria puesto esa clase. Simplemente con poner por ejemplo:

Cuadritos(vJugador.jPosicion.X, vJugador.jPosicion.Y + 1).relleno = "edificio"
o
Cuadritos(vJugador.jPosicion.X, vJugador.jPosicion.Y + 1).relleno = 4
me habria sobrado.

Yo apuesto a que el fallo estaba en que como no habia variable mapatipo -al menos por lo que veo- te comparaba un valor con un null y por eso el nullpointerexception.

Prueba a poner algo como en los ejemplos que he puesto a ver si asi va ;)

PD: Disculpa si estas soluciones no van pero hace como año y pico que no toco el visual basic y bastantes cosas las he olvidado ya -me hago un lio entre ese lenguaje y el que uso yo ahora :P


EDIT:::::::::::
Mecachis diez! ves lo que te decia? como en el mio no hace falta poner new loquesea se me habia pasado por alto el detalle ese!

Felicidades por haberlo solucionado y suerte ;)

#8

Escrito 14 agosto 2009 - 13:34

[code:1] If (Cuadritos(vJugador.jPosicion.X, vJugador.jPosicion.Y + 1).relleno = MapaTipo.tipos.Edificio) = False Then '<--- AQUI DA EL FALLO [/code]

1 cosa: en el if haces "(blablabla = FALSE)
No se como sera en VB, pero.... no seria == FALSE??

El operador '=' es de asignación, no de comparacion.

Otra cosa: Existen ciertos tipos basicos (string, int, float...) que no hay que hacer new cuando los declaras. Sin embargo, para los demas si que tienes que hacerlo.

  • Ellolo17

  • Zodiark

  • vida restante: 100%
  • Registrado: 16 nov 2006
  • Mensajes: 6.208
#9

Escrito 14 agosto 2009 - 13:48

[code:1] If (Cuadritos(vJugador.jPosicion.X, vJugador.jPosicion.Y + 1).relleno = MapaTipo.tipos.Edificio) = False Then '<--- AQUI DA EL FALLO [/code]

1 cosa: en el if haces "(blablabla = FALSE)
No se como sera en VB, pero.... no seria == FALSE??

El operador '=' es de asignación, no de comparacion.

Otra cosa: Existen ciertos tipos basicos (string, int, float...) que no hay que hacer new cuando los declaras. Sin embargo, para los demas si que tienes que hacerlo.


En el Basic esta bien asi ;) Es un lenguaje mucho mas flexible, con sus cosas buenas y sus cosas malas: Las buenas es la flexibilidad y lo bien que te sientes al poder hacer una variable en cualquier punto del codigo.

La mala es que crea malas practicas en los programadores. Al final puede que el codigo sea todo un lio. Lo mejor es aprender primero en uno estricto como el c/c++ y luego si eso pasarse a este.

Un saludo.

  • |xtreme|

  • Zodiark

  • vida restante: 100%
  • Registrado: 14 ene 2005
  • Mensajes: 711
#10

Escrito 19 agosto 2009 - 19:34

Dim vJugador as Jugador

y se ha solucionado al ponerlo como:

Dim vJugador as New Jugador

Lo que no entiendo es por qué, pero bueno :S

Dentro de los casi nulos conocimientos de programación que tengo, lo comprendo como crear un nuevo objeto (ahí que sea "new") de una clase ya existente.

Imagen Enviada
¡Lee y vota los mejores relatos de terror (y sandwiches) de Gamefilia!


No esta tan claro, al menos para mi. La disyuntiva entre el bien y el mal es:

Dim prueba as string

¿Por qué no a New String? Si pones New, el compilador te dirá que la clase String no tiene ningún constructor. Sin embargo, hay cosas como los dataset, que si pongo New. En este caso lo comprendo, ya que es un control, pero en este otro caso, no :S

Un saludo, Btc


MEEEC, desde cuando no hay que instanciar los string?

Prueba a hacer

dim s as String

s = s.ToString()

.......


Por cierto, deberiais aprender a utilizar el debugger, porque estas preguntas....


Este tema ha sido archivado. Esto significa que no puedes responder en este tema.
publicidad
publicidad