C#: Почему я получаю OutofmemoryException на NullReferenceException?
-
13-09-2019 - |
Вопрос
Я получил OutOfMemoryException
раньше и не мог понять, для чего это было. Это не имело никакого смысла вообще. Копал в моем коде и внезапно вспомнил, что где -то забыло проверить на NULL, и в данном конкретном случае это было (и должно быть) именно это. Это не должно вызывать OutOfMemoryException
По моему мнению, но я исправил это, конечно. И когда я это сделал, исключение больше не появилось!
Поэтому я снова удалил чек и изучил исключение, которое я получил еще. И оказывается, что у него было Innerexception типа NullReferenceException
и стек следа, что, конечно, сделано много Больше смысла.
Но почему я получил OutOfMemoryException
? Это никогда не случилось со мной раньше ... не имеет смысла для меня ...
Хотел бы дать немного больше контекста, но не могу сказать много, не загружая весь проект, который я не могу (и который вы не захотите читать в любом случае: P). Но конкретное место, которое он случился, выглядит так:
{
foreach (var exportParameter in exportParameters)
{
// Copy to local
var ep = exportParameter;
// Load stored values from db
...
}
int i = 1;
exportParameters
.OrderBy(ø => ø.Sequence)
.ForEach(ø => { if (!ø.Locked) ø.Sequence = i++; });
}
Исправление состояло в том, чтобы положить if(exportParameters != null)
Перед блоком кода. exportParameters
это List<ExportParameter>
, кроме как в случае неудачного случая, в котором он был null
.
Решение
Возможно, вы столкнетесь с проблемой, в которой предназначены ограниченные области выполнения, чтобы предотвратить, то есть, тот, на который опирается ваш пункт о ущербе, вызывает условие вне памяти.
(В ответ на комментарий Свиша это первая ссылка, когда мы гуглируем фразу: http://msdn.microsoft.com/en-us/library/ms228973.aspx)
Другие советы
Помимо очевидной причины для получения Oomexception, вы также можете получить его, если у вас все еще есть память, но не достаточно большой кусок для того, что запрашивается. Если вы получаете это надежно и относительно близко запуска, вы, вероятно, случайно запрашиваете больше памяти, чем намерены (т.е. запрашивая очень большой массив). Можете ли вы опубликовать немного своего кода или хотя бы описать свой шаблон распределения?