テクニカル リードから次のような質問を受けました。
彼はクラスを作成し、オブジェクトを宣言して初期化しました。ただし、状況によっては、「null 参照」例外が発生する場合があります。
彼は、そのような例外には 1000 の理由が考えられるとコメントし、私に 1 つの理由を推測するように求めました。
私はそれを理解することができません。そのような例外が発生する可能性がある理由は何ですか?
10 に答える
- 明示的に null に設定したオブジェクト参照を使用したか、または
- 暗黙的に null に設定したオブジェクト参照を使用したか、または
- あなたのコード、またはあなたが呼び出したコードのどこかに、ステートメントが
throw new NullReferenceException()
あります (ちなみに、これはすべきではありません)。実際の null 参照ではないため、これが重要かどうかはわかりません。
他の 997 の理由は思いつきません。
編集:ポイント 3 について、Mark Byers さん、ありがとうございます。
マルチスレッド アプリの場合は、他のスレッドが発生して、オブジェクトを null 参照に設定する可能性があります。
スタックオーバーフロー?
{◕ ◡ ◕}
私が考えることができるいくつかの方法:
NullReferenceException
コンストラクターは、完了する前にa をスローできます。- プロパティにアクセスすると、プロパティは
NullReferenceException
. try { } finally { }
コードにNullReferenceException
.- 割り当て中に暗黙的な変換が行われる可能性があり、変換のコードは
NullReferenceException
.
最後のコード例は次のとおりです。
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.
}
}
彼はクラスを作成し、オブジェクトを宣言して初期化しました。ただし、状況によっては、「null参照」例外が発生する場合があります。彼は、そのような例外には1000の考えられる理由があるとコメントし、1つの理由を推測するように私に求めました。私はそれを理解することができません。そのような例外が発生する可能性がある理由は何ですか?
簡単な答え:私はインタビュアーに、見えないコードをデバッグすることはできないと言います。問題のあるコード行とデバッガーを確認するように依頼します。
それほど単純ではない答え:あなたのインタビュアーがばかではないと仮定すると、彼はおそらくあなたのデバッグスキルにあなたを感じています。くだらないバグレポートを受け取った場合は、腕を上げてすぐに降伏しますか、それとも解決しようとしますか。
推測は、エラーをデバッグするための許容できる方法ではありません。最初のステップは、マシンでバグを再現することです。
確実に再現しますか?はいの場合は、デバッガーを取り出します。
いいえの場合、断続的に、または非決定的に再現できますか?例外は、コード内のさまざまな場所またはさまざまなスレッドでランダムに発生しますか?はいの場合、おそらく何らかの競合状態にあるか、ポインタが破損している可能性があります。
いいえの場合は、バグを見つけた人に再現を依頼してください。最初にバグを見つけた人と同じ手順を踏むと、再現できますか?はいの場合、上記を参照してください。
いいえの場合、環境に違いはありますか?構成ファイル?データベース内のデータ?最新のサービスパックやソフトウェアアップデートなどで環境が更新されていますか?
インタビュアーに回答を与えることはできませんが、最終的に回答に到達するために実行する手順のリストをインタビュアーに提供することはできます。
専門家ではなく、ただの憶測で、記憶がありませんか?
何かをいつでも null 値に初期化できます。
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(); } }
}
マルチスレッド コードでは、オブジェクトが作成された後、変数がその場所に割り当てられる前に、変数にアクセスできます。
問題のオブジェクトには、メイン オブジェクトのコンストラクターで初期化されていない他のオブジェクトが含まれている可能性があります。この質問では、null 参照例外が発生する場所や時期を指定していません。
あと999。
インタビュアーは実際、あなたが問題を解決する方法、つまり、さまざまな原因によって引き起こされる可能性のある問題を解決するためにどのようなトラブルシューティング手順を実行するかを探していたと思います。