2010-04-01 20 views
7

Un responsabile tecnico mi ha chiesto quanto segue:
Ha creato una classe, dichiarato un oggetto e inizializzato. Ma in alcune circostanze potremmo ottenere un'eccezione "riferimento null".
Ha commentato che ci sono 1000 possibili ragioni per tale eccezione e mi ha chiesto di indovinare un singolo motivo.
Non riesco a capirlo. Qual è (sono) la ragione (s), possiamo ottenere una tale eccezione?Domanda intervista in C#

+59

Spero che abbia spiegato la domanda meglio di te ... –

+5

Che domanda stupida. – spoulson

+1

Non è proprio stupido, gli ha fatto pensare e avrebbe dato all'intervistatore un'idea di come pensa e di come gestisce le domande "azzardate". Dubito che l'intervistatore sia interessato alla sua vera risposta, ma a come è arrivato. – AndrewC

risposta

4

Non è un esperto, ma solo una congettura sfrenata, fuori dalla memoria?

+6

In .NET credo ci sia un OutOfMemoryException, che è quello che otterresti (a meno che tu non abbia gestito OutOfMemoryException e continui come se nulla fosse sbagliato: D) –

+2

@Mike non puoi fare una cosa del genere;) – Maghis

+0

Eh? Non vedo perché le condizioni OOM non possano essere gestite con garbo. –

8

Se si tratta di un'app multi-thread, è possibile che venga eseguito un altro thread e che imposti l'oggetto su un riferimento null.

4

È sempre possibile inizializzare qualcosa su un valore nullo;

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

Overflow di stack?

{◕ ◡ ◕}

+5

Mi piacerebbe fare +1. ma non voglio – Midhat

+0

@Mithat: Va bene, avere un +1 da me comunque per il tuo avatar FAAABULOUS! –

+1

+1: carino <3 <3 <3 – Juliet

11
  1. si è utilizzato un riferimento a un oggetto che avete impostato in modo esplicito a nulla, o
  2. Hai utilizzato un riferimento a un oggetto che avete implicitamente impostato su null o
  3. Da qualche parte nel tuo codice, o in codice chiamato da te, c'è la dichiarazione throw new NullReferenceException() (che non dovresti fare, a proposito). Non so se questo conta, dal momento che non è un vero riferimento nullo.

Non riesco a pensare a nessuno degli altri 997 motivi.

Edit: Grazie, Mark Byers, per il punto 3.

7

A pochi modi che posso pensare:

  • Il costruttore può lanciare una NullReferenceException prima del completamento.
  • Quando si accede a una proprietà, la proprietà può generare un NullReferenceException.
  • Se si dispone di un try { } finally { } attorno al codice, se genera un'eccezione, infine, viene eseguito e il codice in infine potrebbe generare un NullReferenceException.
  • Potrebbe esserci una conversione implicita durante l'assegnazione e il codice per la conversione genera un NullReferenceException.

Ecco esempio di codice per l'ultimo:

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

L'oggetto in questione può contenere altri oggetti che non sono inizializzate nel costruttore dell'oggetto principale. La domanda non specifica dove o quando si sta verificando l'eccezione di riferimento null.

999 to go.

1

Nel codice multi-thread è possibile accedere alla variabile dopo che l'oggetto è stato creato, ma prima che la variabile sia stata assegnata alla sua posizione.

0

Penso che l'intervistatore stia effettivamente cercando come si risolverebbe il problema, vale a dire quali passi di risoluzione dei problemi si potrebbe prendere per risolvere un problema che potrebbe essere causato da mille cose diverse.

6

Ha creato una classe, ha dichiarato un oggetto e l'ha inizializzato. Ma in alcune circostanze possiamo ottenere l'eccezione "riferimento ". Ha commentato che ci sono 1000 possibili ragioni per tale eccezione e mi ha chiesto di dare un'occhiata a per un singolo motivo. Non riesco a capirlo. Quali sono (sono) i motivi dello , potremmo ottenere un'eccezione ?

risposta diretta: direi l'intervistatore che non si può eseguire il debug di codice non si può vedere. Chiedi di vedere la linea di codice offendente e un debugger.

Risposta non molto semplice: supponendo che l'intervistatore non sia un idiota, probabilmente ti sente fuori per le tue abilità di debug. Se ricevi una segnalazione di bug schifoso, alzi le braccia e ti arrendi subito, o cerchi di risolverlo.

L'ipotesi è non un modo accettabile per eseguire il debug dell'errore. Il primo passo sarebbe la riproduzione del bug sulla tua macchina.

Si riproduce in modo affidabile? Se sì, fai uscire il tuo debugger.

In caso negativo, è possibile riprodurlo in modo intermittente o non deterministico? L'eccezione si verifica in modo casuale in diversi punti del codice o su thread diversi? Se sì, probabilmente hai una sorta di condizione di competizione, o forse un puntatore danneggiato.

In caso negativo, chiedere a chi ha trovato il bug da riprodurre. Quando segui gli stessi passi della persona che ha originariamente trovato il bug, puoi riprodurlo? Se sì, vedi sopra.

Se no, c'è una differenza negli ambienti? File di configurazione? Dati nei database? L'ambiente è aggiornato con i service pack, gli aggiornamenti software e così via?

Non è possibile fornire una risposta all'intervistatore, ma è possibile fornirgli un elenco di passaggi da intraprendere per ottenere una risposta.

+2

+1 per "Indovinare non è un modo accettabile di eseguire il debug". È incredibile quanto spesso ciò accada. –