2010-04-01 8 views
7

Ein technischer Leiter fragte mich folgendes:
Er erstellte eine Klasse, erklärte ein Objekt und initialisierte es. Aber unter gewissen Umständen können wir eine "Nullreferenz" -Ausnahme erhalten.
Er kommentierte, dass es 1000 mögliche Gründe für diese Ausnahme gibt und bat mich, einen einzigen Grund zu erraten.
Ich kann es nicht herausfinden. Was (sind) die Gründe, können wir eine solche Ausnahme bekommen?Frage im Vorstellungsgespräch in C#

+59

Ich hoffe, er erklärte die Frage besser als Sie ... –

+5

Was für eine dumme Interviewfrage. – spoulson

+1

Es ist nicht wirklich dumm, es hat ihn zum Nachdenken gebracht und dem Interviewer eine Vorstellung davon gegeben, wie er denkt und wie er mit "zwielichtigen" Fragen umgeht. Ich bezweifle, dass der Interviewer an seiner tatsächlichen Antwort interessiert war, sondern eher daran, wie er dazu gekommen ist. – AndrewC

Antwort

4

Nicht ein Experte, aber nur eine wilde Vermutung, nicht genügend Speicher?

+6

In .NET Ich glaube, es gibt eine OutOfMemoryException, die Sie bekommen würden (es sei denn Sie die OutOfMemoryException behandelt und fortgesetzt wie nichts war falsch) D) –

+2

@Mike Sie können so etwas nicht;) – Maghis

+0

Eh? Ich sehe nicht, warum OOM-Bedingungen nicht ordnungsgemäß behandelt werden können. –

8

Wenn es sich um eine Multithread-App handelt, könnte ein anderer Thread dazukommen und das Objekt auf eine Nullreferenz setzen.

4

Sie können immer etwas mit einem Nullwert initialisieren;

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

Stapelüberlauf?

{◕ ◡ ◕}

+5

Ich würde gerne +1 geben. aber ich werde – Midhat

+0

@Mithat: Das ist in Ordnung, haben Sie eine +1 von mir sowieso für Ihre FAAABULOUS Avatar! –

+1

+1: niedlich <3 <3 <3 – Juliet

11
  1. Sie haben einen Objektverweis verwendet explizit auf null gesetzt haben, oder
  2. Sie einen Objektverweis verwendet haben Sie implizit auf Null gesetzt haben, oder
  3. Irgendwo In Ihrem Code oder in dem von Ihnen aufgerufenen Code befindet sich die Anweisung throw new NullReferenceException() (die Sie übrigens nicht tun sollten). Ich weiß nicht, ob das zählt, da es kein echter Nullbezug ist.

Ich kann nicht an eine der anderen 997 Gründe denken.

Edit: Danke, Mark Byers, für Punkt 3.

7

ein paar Möglichkeiten, die ich denken kann:

  • Der Konstruktor einen NullReferenceException werfen kann, bevor es abgeschlossen ist. Wenn Sie auf eine Eigenschaft zugreifen, kann die Eigenschaft eine NullReferenceException werfen.
  • Wenn Sie eine try { } finally { } um den Code haben, wenn es eine Ausnahme auslöst, läuft die schließlich und der Code in der endgültigen könnte eine NullReferenceException werfen.
  • Während der Zuweisung konnte eine implizite Konvertierung stattfinden, und der Code für die Konvertierung löst eine NullReferenceException aus.

Hier ist Beispielcode für die letzten:

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

Das betreffende Objekt kann andere Objekte enthalten, die in der Hauptsache Konstruktor nicht initialisiert werden. Die Frage gibt nicht an, wo oder wann die NULL-Referenzausnahme auftritt.

999 zu gehen.

1

Im Multi-Threaded-Code kann auf die Variable zugegriffen werden, nachdem das Objekt erstellt wurde, aber bevor die Variable ihrer Position zugewiesen wurde.

0

Ich glaube, der Interviewer suchte tatsächlich nach wie Sie würden über die Lösung des Problems gehen, dh welche Schritte zur Fehlerbehebung Sie ein Problem lösen, das durch tausend verschiedene Dinge verursacht werden könnte.

6

Er erstellte eine Klasse, deklarierte ein Objekt und initialisierte es. Aber in einigen Umständen können wir "null Referenz" Ausnahme erhalten. Er kommentierte , dass es 1000 mögliche Gründe gibt für solche Ausnahme und fragte mich erraten einen einzigen Grund. Ich kann nicht herausfinden. Was ist (sind) die Grund (e), können wir solch eine Ausnahme bekommen?

einfache Antwort: Ich würde den Interviewer sagen, dass Sie können Debug-Code nicht, dass Sie nicht sehen können. Bitten Sie darum, eine problematische Codezeile und einen Debugger zu sehen.

Nicht so einfache Antwort: vorausgesetzt, Ihr Interviewer ist kein Idiot, er fühlt Sie wahrscheinlich für Ihre Debugging-Fähigkeiten. Wenn du einen beschissenen Fehlerbericht bekommst, wirfst du deine Arme hoch und gibst dich sofort hin oder versuchst du, es zu lösen.

Raten ist nicht eine akzeptable Möglichkeit, den Fehler zu debuggen. Der erste Schritt wäre die Reproduktion des Fehlers auf Ihrem Computer.

Vervielfältigt es zuverlässig? Wenn ja, bringen Sie Ihren Debugger raus.

Wenn nein, können Sie es intermittierend oder nicht deterministisch reproduzieren? Tritt die Ausnahme zufällig an verschiedenen Stellen im Code oder in verschiedenen Threads auf? Wenn ja, haben Sie wahrscheinlich eine Art Race-Condition oder vielleicht einen beschädigten Zeiger.

Wenn nein, fragen Sie, wer den Fehler gefunden hat, um ihn zu reproduzieren. Wenn Sie denselben Schritten folgen wie die Person, die den Fehler ursprünglich gefunden hat, können Sie reproduzieren? Wenn ja, siehe oben.

Wenn nein, gibt es Unterschiede in den Umgebungen? Konfigurationsdateien? Daten in den Datenbanken? Wird die Umgebung mit den neuesten Service Packs, Softwareupdates usw. aktualisiert?

Sie können Ihrem Interviewer keine Antwort geben, aber Sie können ihm eine Liste der Schritte geben, die Sie unternehmen würden, um zu einer Antwort zu gelangen.

+2

+1 für "Raten ist keine akzeptable Möglichkeit zum Debuggen". Es ist erstaunlich, wie oft das passiert. –