2010-04-01 29 views
7

Un técnico me preguntó lo siguiente:
Creó una clase, declaró un objeto y lo inicializó. Pero en algunas circunstancias podemos obtener una excepción de "referencia nula".
Comentó que hay 1000 posibles razones para tal excepción y me pidió que adivinara una sola razón.
No puedo resolverlo. ¿Cuál es (son) la (s) razón (es), podemos obtener tal excepción?Pregunta de entrevista en C#

+59

Espero que haya explicado la pregunta mejor que usted ... –

+5

¡Qué pregunta tan tonta! – spoulson

+1

No es realmente tonto, lo hizo pensar y le habrá dado al entrevistador una idea de cómo piensa y cómo maneja las preguntas "poco fiables". Dudo que el entrevistador estuviera interesado en su respuesta real, sino en cómo llegó a ella. – AndrewC

Respuesta

4

¿No es un experto, pero solo una suposición descabellada, sin memoria?

+6

En .NET Creo que hay una OutOfMemoryException, que es lo que obtendrías (a menos que manejases la OutOfMemoryException y continuaras como si nada estuviera mal: D) –

+2

@Mike no puedes hacer tal cosa;) – Maghis

+0

¿Eh? No veo por qué las condiciones de OOM no se pueden manejar con elegancia. –

8

Si se trata de una aplicación de subprocesos múltiples, puede aparecer algún otro subproceso y establecer el objeto como una referencia nula.

4

Siempre puede inicializar algo con un valor nulo;

public class MyClass 
{ 
    // initialized to null 
    private string _myString = null; 

    // _myString is initialized, but this throws null reference 
    public int StringLength { get { return _myString.Length(); } } 
} 
7

Desbordamiento de la pila?

{◕ ◡ ◕}

+5

Me encantaría tener +1. pero no lo haré – Midhat

+0

@Mithat: ¡Está bien, de todos modos, tengo un +1 de mí para su FAAABULOUS avatar! –

+1

+1: lindo <3 <3 <3 – Juliet

11
  1. usted ha utilizado una referencia de objeto que se ha establecido explícitamente en null, o
  2. Ha utilizado una referencia de objeto que haya configurado de forma implícita a nulo, o
  3. En alguna parte en su código, o en el código que usted llama, existe la declaración throw new NullReferenceException() (que no debe hacer, por cierto). No sé si esto cuenta, ya que no es una referencia real nula.

No puedo pensar en ninguna de las otras 997 razones.

Editar: Gracias, Mark Byers, para el punto 3.

7

Algunas maneras que se me ocurren:

  • El constructor puede lanzar una NullReferenceException antes de que se complete.
  • Al acceder a una propiedad, la propiedad puede arrojar un NullReferenceException.
  • Si tiene un try { } finally { } alrededor del código, si arroja una excepción, finalmente se ejecuta y el código en el finalmente podría arrojar un NullReferenceException.
  • Puede haber una conversión implícita durante la asignación y el código para la conversión arroja un NullReferenceException.

Aquí es código de ejemplo para el último:

class Foo {} 

class Bar 
{ 
    public static implicit operator Foo(Bar bar) 
    { 
     throw new NullReferenceException(); 
    } 
} 

class Program 
{ 
    public static void Main() 
    { 
     Foo foo = new Bar(); // This causes a NullReferenceException to be thrown. 
    } 
} 
1

El objeto en cuestión puede contener otros objetos que no se inicializan en el constructor del objeto principal. La pregunta no especifica dónde o cuándo se produce la excepción de referencia nula.

999 ir.

1

En el código de subprocesos múltiples, se puede acceder a la variable después de que se haya creado el objeto, pero antes de que la variable se haya asignado a su ubicación.

0

Creo que el entrevistador en realidad estaba buscando cómo que resolvería el problema, es decir, qué pasos de solución de problemas tomaría para resolver un problema que podría ser causado por mil cosas diferentes.

6

Creó una clase, declaró un objeto y lo inicializó. Pero en alguna circunstancia podemos obtener la excepción de "nulo referencia". Comentó que hay 1000 posibles razones para tal excepción y me pidió que adivine una sola razón. No puedo resolverlo. ¿Cuál es (son) el (los) motivo (s) , podemos obtener tal excepción ?

respuesta directa: Le diría al entrevistador que no se puede depurar el código no se puede ver. Pida ver la línea ofensiva de código y un depurador.

No tan sencillo respuesta: asumiendo que su entrevistador no es un idiota, probablemente lo está presionando por sus habilidades de depuración. Si recibes un informe de error, levantas los brazos y te rindes de inmediato o intentas resolverlo.

Adivinar es no una forma aceptable de corregir el error. El primer paso sería reproducir el error en su máquina.

¿Se reproduce con fiabilidad? En caso afirmativo, saque su depurador.

Si no, ¿puede reproducirlo de forma intermitente o no determinista? ¿La excepción ocurre al azar en diferentes lugares en el código o en diferentes hilos? Si es así, probablemente tengas algún tipo de condición de carrera, o tal vez un puntero corrupto.

Si no, pregúntale a quien encontró el error para reproducir. Cuando sigues los mismos pasos que la persona que originalmente encontró el error, ¿puedes reproducir? Si es así, mira arriba.

Si no, ¿hay alguna diferencia en los entornos? ¿Archivos de configuración? Datos en las bases de datos? ¿El ambiente está actualizado con los últimos service packs, actualizaciones de software, etc.?

No podrá darle una respuesta al entrevistador, pero puede darle una lista de los pasos que tomaría para eventualmente obtener una respuesta.

+2

+1 para "Adivinar no es una forma aceptable de depuración". Es sorprendente la frecuencia con la que esto sucede. –

Cuestiones relacionadas