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#
risposta
Non è un esperto, ma solo una congettura sfrenata, fuori dalla memoria?
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) –
@Mike non puoi fare una cosa del genere;) – Maghis
Eh? Non vedo perché le condizioni OOM non possano essere gestite con garbo. –
Se si tratta di un'app multi-thread, è possibile che venga eseguito un altro thread e che imposti l'oggetto su un riferimento null.
È 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(); } }
}
- si è utilizzato un riferimento a un oggetto che avete impostato in modo esplicito a nulla, o
- Hai utilizzato un riferimento a un oggetto che avete implicitamente impostato su null o
- 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.
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 unNullReferenceException
. - 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.
}
}
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.
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.
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.
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.
+1 per "Indovinare non è un modo accettabile di eseguire il debug". È incredibile quanto spesso ciò accada. –
- 1. Domanda intervista Microsoft ASM?
- 2. Implementazione dell'interfaccia domanda intervista
- 3. Google Intervista Domanda
- 4. Domanda Di Intervista: Cowgirl coppie
- 5. Domanda intervista: cos'è una hashmap?
- 6. Domanda intervista Amazon: progettare un parcheggio OO
- 7. Java Domanda Di Intervista: finalizzare() metodo
- 8. Quanto è chiara questa domanda di intervista?
- 9. Domanda intervista: possiamo avere un'eco prima dell'intestazione?
- 10. Odd C questione intervista
- 11. Domanda intervista: programma C per ordinare un array binario in O (n)
- 12. Domanda intervista: quando Control.InvokeRequired usi Control.Invoke o Control.BeginInvoke?
- 13. Intervista su C# implicita conversione
- 14. Puntatore C/C++ Domanda
- 15. ReverseString, una domanda dell'intervista C#
- 16. Domanda semplice: Riflessioni in C#
- 17. Domanda su const_cast in C++
- 18. Domanda matematica in C o obiettivo C
- 19. SQL questione intervista
- 20. Domanda intervista: numero di bit swap necessari per convertire un numero intero in un altro
- 21. intervista amazon prob
- 22. Algoritmo elenco matrici - Intervista
- 23. Interfaccia C# domanda
- 24. Domanda generale C#
- 25. base C++ domanda memoria
- 26. C++ eredità/template domanda
- 27. Domanda su C# covarianza
- 28. C# polimorfismo semplice domanda
- 29. C# - GC.GetTotalMemory() Domanda
- 30. Intervista Coding Java Sorting
Spero che abbia spiegato la domanda meglio di te ... –
Che domanda stupida. – spoulson
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