Вопрос об интервью в C#

Технический руководитель спросил меня следующее:
Он создал класс, объявил объект и инициализировал его. Но при некотором обстоятельстве мы можем получить исключение "нулевой ссылки".
Он прокомментировал, что существует 1 000 возможных причин для такого исключения и попросили, чтобы я предположил единственную причину.
Я не могу понять это. Что причина (причины), мы можем получить такое исключение?

7
задан Graham Clark 1 April 2010 в 14:09
поделиться

10 ответов

  1. Вы использовали ссылку на объект, которую явно установили в null, или
  2. Вы использовали ссылку на объект, которую неявно установили в null, или
  3. Где-то в вашем коде или в коде, вызванном вами, есть утверждение throw new NullReferenceException() (чего вы, кстати, делать не должны). Я не знаю, считается ли это, поскольку это не настоящая нулевая ссылка.

Я не могу вспомнить ни одной из других 997 причин.

Редактировать: Спасибо, Марк Байерс, за пункт 3.

11
ответ дан 6 December 2019 в 04:51
поделиться

Переполнение стека?

{◕ ◡ ◕}

7
ответ дан 6 December 2019 в 04:51
поделиться

Вы всегда можете инициализировать что-либо нулевым значением;

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(); } }
}
4
ответ дан 6 December 2019 в 04:51
поделиться

Я думаю, что интервьюер на самом деле искал как вы будете решать проблему, т.е. какие шаги по устранению неполадок вы предпримите для решения проблемы, которая может быть вызвана тысячей разных вещей.

0
ответ дан 6 December 2019 в 04:51
поделиться

Если это многопоточное приложение, то может появиться какой-то другой поток и установить для объекта нулевую ссылку.

8
ответ дан 6 December 2019 в 04:51
поделиться

Не эксперт, а просто дикая догадка, нехватка памяти?

4
ответ дан 6 December 2019 в 04:51
поделиться

Рассматриваемый объект может содержать другие объекты, которые не инициализированы в конструкторе основного объекта. Вопрос не указывает, где и когда возникает исключение нулевой ссылки.

Осталось 999.

1
ответ дан 6 December 2019 в 04:51
поделиться

В многопоточном коде к переменной можно получить доступ после создания объекта, но до того, как переменная будет назначена его местоположению.

1
ответ дан 6 December 2019 в 04:51
поделиться

Несколько способов, о которых я могу думать:

  • Конструктор может выбросить 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.
    }
}
7
ответ дан 6 December 2019 в 04:51
поделиться

Он создал класс, объявил объект и инициализировал его. Но в некоторых обстоятельствах мы можем получить исключение "null reference". Он прокомментировал , что существует 1000 возможных причин такого исключения, и попросил меня угадать единственную причину. Я не могу понять это. Каковы причины, по которым мы можем получить такое исключение?

Прямой ответ : Я бы сказал интервьюеру, что вы не можете отлаживать код ты не можешь видеть. Попросите показать оскорбительную строку кода и отладчик.

Не очень простой ответ : если ваш интервьюер не идиот, он, вероятно, прощупывает ваши навыки отладки. Если вы получите дерьмовый отчет об ошибке, вы сразу же сдадитесь и попытаетесь решить эту проблему.

Предположение - это не приемлемый способ отладки ошибки. Первым шагом будет воспроизведение ошибки на вашем компьютере.

Надежно ли воспроизводится? Если да, достаньте отладчик.

Если нет, можете ли вы воспроизводить его периодически или недетерминированно? Возникает ли исключение случайным образом в разных местах кода или в разных потоках? Если да, возможно, у вас какое-то состояние гонки или, возможно, поврежденный указатель.

Если нет, попросите того, кто нашел ошибку, воспроизвести. Если вы выполните те же действия, что и человек, который изначально обнаружил ошибку, сможете ли вы воспроизвести ее? Если да, см. Выше.

Если нет, есть ли разница в средах? Файлы конфигурации? Данные в базах данных? Обновлена ​​ли среда последними пакетами обновления, обновлениями программного обеспечения и т. Д.?

Вы не сможете дать интервьюеру ответ, но вы можете дать ему список шагов, которые вы должны предпринять, чтобы в конечном итоге получить ответ .

6
ответ дан 6 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: