2014-01-04 3 views
2

У меня есть следующий код:Почему может возникнуть исключение NullReferenceException?

try { 
    using (var stream = new MemoryStream()) { 
     var ms = stream; 
     if (control is DockLayoutManager) { 
      if (control.Dispatcher == null || control.Dispatcher.CheckAccess()) { 
       ((DockLayoutManager)control).SaveLayoutToStream(ms); 
      } 
     } 
    } 
} catch (Exception e) { 
    log.Error(string.Format("Cannot GetLayout ({0}).", typeName), e); 
} 

Время от времени я получаю NullReferenceException на линии

((DockLayoutManager)control).SaveLayoutToStream(ms); 

Я понятия не имею, почему может быть NullReferenceException на этой линии.

Надеюсь, кто-то может мне помочь.

+3

Положите точку останова на эту линию.Что-нибудь «нуль» в этот момент? Простое использование отладчика может исправить 99,99% от 'NullReferenceException'. –

+1

Не должно быть 'if (control! = Null && control.Dispatcher! = Null && control.Dispatcher.CheckAccess()) {' –

+1

Возможно, это ошибка в 'SaveLayoutToStream'? Показать трассировку стека. –

ответ

4

Проблема заключается в .SaveLayoutToStream(ms)

Это случилось несколько раз, прежде чем:

https://www.devexpress.com/Support/Center/Question/Details/B190607 http://www.devexpress.com/Support/Center/Question/Details/B221485 https://www.devexpress.com/Support/Center/Question/Details/Q445171

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

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

Кажется, это проблема с сериализацией. Номер выпуска B221485 указывает на то, что наличие элемента управления с типом DefaultBoolean устанавливается в -1 и впоследствии взрывается. Служба поддержки указала, что вы найдете любое из этих свойств, в которых вы устанавливаете такое свойство: true или false как индикаторы того, что исправить. кажется странным.

+1

+1 Для приятного поиска в Google! (Я не понимал, что это DevXpress .. мысль о том, что ошибка в методе показалась мне смешной, пока я не увидел это!) –

1

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

Идеи:

  1. Что-то в control.Dispatcher.CheckAccess может установить control в null. Это был бы ужасный код.
  2. Это потоковая ошибка (гонка).
  3. Устаревший исходный файл. Перестройте решение.
  4. Что-то внутри SaveLayoutToStream бросило, и вы неверно истолковали исключение местоположения. Посмотрите на трассировку стека, чтобы узнать. Установите отладчик для исключения исключений (Ctrl-Alt-E).
+1

+1. Твердые предложения. –

0

Похож на состояние гонки для меня, например. что-то изменило контроль после проверки.

Кстати, это будет рекомендовано сделать что-то вроде:

var dockLayoutManager = control as DockLayoutManager; 

if (dockLayoutManager != null) { 
     if (dockLayoutManager.Dispatcher == null || dockLayoutManager.Dispatcher.CheckAccess()) { 
      dockLayoutManager.SaveLayoutToStream(ms); 
     } 
    } 

Так что вам не придется дважды бросить.

Смежные вопросы