2010-08-11 123 views
14

que tienen la siguiente línea de código:null.Equals (null) ¿Por qué aparece una NullReferenceException

var selectedDomainID = lkuDomainType.EditValue.Equals(null) 
    ? string.Empty 
    : lkuDomainType.EditValue; 

A veces esto genera un NullReferenceException. Lo que no entiendo es por qué. ¿No es el objetivo de mi código verificar null y, de ser así, asignar string.empty? Cuando reviso DEBUG, dice EditValue == null, ¿qué me estoy perdiendo?

+2

no puede lkuDomkainType ser nulo por sí mismo? Cuando llamas a lkuDomainType.EditValue, arroja la NullReferenceException. –

+2

Debido a su título: 'a == b' no es lo mismo que' a.Equals (b) '. –

+0

@Stefan: ¡Buen momento! Modificado para ser más preciso para los buscadores futuros ... Gracias –

Respuesta

26

Use lkuDomainType.EditValue == null, de lo contrario, intenta llamar a un método de instancia en un objeto nulo. Pero la mejor opción podría ser lkuDomainType.EditValue ?? String.Empty. También tenga cuidado con lkuDomainType siendo nulo, a menos que sea una clase, no un objeto.

+1

Gracias, parece bastante obvio en retrospectiva, definitivamente un momento 'duh'. Gracias. –

+4

+2 (desafortunadamente no posible) para la respuesta correcta y la recomendación de usar '??'. –

+0

+1: el operador nulo coalescente (o '??') era una gran adición a .NET y algo que echo de menos al usar Java. – Powerlord

15

Cuando utiliza Object.Property y Object no está definido, está desreferenciando un puntero nulo y es por eso que obtiene la excepción. En su lugar, utilice:

var selectedDomainID = lkuDomainType.EditValue == null ? string.Empty : lkuDomainType.EditValue; 
+5

Tuve que votar esta respuesta a) por la respuesta correcta, b) por usar * dereferencia * en la oración, yb) por el nombre de usuario casi apropiado –

+0

Excelente respuesta, +1, pero SO dice que la respuesta de @Yuriy fue la primera . Gracias sin embargo. –

+1

@Refracted Sí lo fue, por 4 segundos :) Me gusta su sugerencia de usar '??' – NullUserException

3

que está intentando llamar al método Equals en un objeto nulo - hacer que esta forma:

lkuDomainType.EditValue == null 
2

EditValue == null. Eso significa que no hay ningún objeto allí. No puede invocar funciones en objetos nulos, incluso si la función es .Equals().

Será mejor que solo diga "(lkuDomainType.EditValue == null)" en este caso.

5

Si EditValue es nulo, entonces no puede llamar al Equals. En este cas que tendría que hacer:

var selectedDomainID = lkuDomainType.EditValue == null ? string.Empty : lkuDomainType.EditValue; 

O puede simplificar haciendo:

var selectedDomainID = lkuDomainType.EditValue ?? string.Empty; 
2

que puedes usar String.IsNullOrEmpty aquí. De esta manera:

var selectedDomainID = String.IsNullOrEmpty(lkuDomainType.EditValue) ? string.Empty : lkuDomainType.EditValue; 

iguales es un método, que está tratando de llamar a un método en un objeto nulo que está lanzando una excepción.

+0

No entiendo, ¿no es 'String.IsNullOrEmpty' también un * método *? –

+0

Es un método estático, no es un método del objeto lkuDomainType.EditValue. – brendan

+0

Ah, gracias por aclararlo. –

2

cuando EditValue es nulo no se puede llamar al método Equals en él por lo que la mejor manera de comprobar es utilizar

lkuDomainType.EditValue == null ? string.Empty : lkuDomainType.EditValue; 
3

El problema es que está utilizando el objeto antes de comprobar si es nulo. Está llamando al método Equals del objeto, que falla si la referencia es nula.

Tienes que cambiar tu lkuDomainType.EditValue.Equals(null) por lkuDomainType.EditValue == null.

0

Si lkuDomainType.EditValue es nulo, entonces "lkuDomainType.EditValue.Equals (someObject)" es lo mismo que codificar "null.Equals (someObject)". Bueno, obviamente "nulo" no tiene ningún miembro o método (no sería nulo si lo hiciera). Es por eso que obtienes una NullReferenceException.

La mayoría de los ejemplos de las otras publicaciones funcionarán, incluido String.IsNullOrEmpty, que es un método que devuelve un valor booleano.

Cuestiones relacionadas