Технический руководитель спросил меня следующее:
Он создал класс, объявил объект и инициализировал его. Но при некотором обстоятельстве мы можем получить исключение "нулевой ссылки".
Он прокомментировал, что существует 1 000 возможных причин для такого исключения и попросили, чтобы я предположил единственную причину.
Я не могу понять это. Что причина (причины), мы можем получить такое исключение?
throw new NullReferenceException()
(чего вы, кстати, делать не должны). Я не знаю, считается ли это, поскольку это не настоящая нулевая ссылка. Я не могу вспомнить ни одной из других 997 причин.
Редактировать: Спасибо, Марк Байерс, за пункт 3.
Вы всегда можете инициализировать что-либо нулевым значением;
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(); } }
}
Я думаю, что интервьюер на самом деле искал как вы будете решать проблему, т.е. какие шаги по устранению неполадок вы предпримите для решения проблемы, которая может быть вызвана тысячей разных вещей.
Если это многопоточное приложение, то может появиться какой-то другой поток и установить для объекта нулевую ссылку.
Рассматриваемый объект может содержать другие объекты, которые не инициализированы в конструкторе основного объекта. Вопрос не указывает, где и когда возникает исключение нулевой ссылки.
Осталось 999.
В многопоточном коде к переменной можно получить доступ после создания объекта, но до того, как переменная будет назначена его местоположению.
Несколько способов, о которых я могу думать:
NullReferenceException
перед завершением. NullReferenceException
. try { } finally { }
, то если он выбрасывает исключение, то выполняется finally, а код в 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 reference". Он прокомментировал , что существует 1000 возможных причин такого исключения, и попросил меня угадать единственную причину. Я не могу понять это. Каковы причины, по которым мы можем получить такое исключение?
Прямой ответ : Я бы сказал интервьюеру, что вы не можете отлаживать код ты не можешь видеть. Попросите показать оскорбительную строку кода и отладчик.
Не очень простой ответ : если ваш интервьюер не идиот, он, вероятно, прощупывает ваши навыки отладки. Если вы получите дерьмовый отчет об ошибке, вы сразу же сдадитесь и попытаетесь решить эту проблему.
Предположение - это не приемлемый способ отладки ошибки. Первым шагом будет воспроизведение ошибки на вашем компьютере.
Надежно ли воспроизводится? Если да, достаньте отладчик.
Если нет, можете ли вы воспроизводить его периодически или недетерминированно? Возникает ли исключение случайным образом в разных местах кода или в разных потоках? Если да, возможно, у вас какое-то состояние гонки или, возможно, поврежденный указатель.
Если нет, попросите того, кто нашел ошибку, воспроизвести. Если вы выполните те же действия, что и человек, который изначально обнаружил ошибку, сможете ли вы воспроизвести ее? Если да, см. Выше.
Если нет, есть ли разница в средах? Файлы конфигурации? Данные в базах данных? Обновлена ли среда последними пакетами обновления, обновлениями программного обеспечения и т. Д.?
Вы не сможете дать интервьюеру ответ, но вы можете дать ему список шагов, которые вы должны предпринять, чтобы в конечном итоге получить ответ .