C #: Pourquoi est-ce que je reçois une OutOfMemoryException sur une nulreferenceException?
-
13-09-2019 - |
Question
J'ai un OutOfMemoryException
Plus tôt et ne pouvait pas comprendre à quoi cela servait. Cela n'avait aucun sens. Dugd dans mon code, et se souvenait soudain que quelque part avait oublié de vérifier Null, et dans ce cas particulier, c'était (et devrait être) exactement cela. Cela ne devrait pas provoquer un OutOfMemoryException
À mon avis, mais je l'ai corrigé bien sûr. Et quand je l'ai fait, l'exception n'est plus apparue!
J'ai donc retiré le chèque à nouveau et étudié l'exception que j'en ai obtenu plus. Et il s'avère qu'il avait un Innerexception du type NullReferenceException
et une trace de pile que bien sûr a fait beaucoup plus de sens.
Mais pourquoi ai-je eu un OutOfMemoryException
? Cela ne m'est jamais arrivé auparavant ... n'a aucun sens pour moi ...
J'adorerais donner un peu plus de contexte, mais je ne peux pas vraiment dire grand-chose sans avoir à télécharger l'ensemble du projet, ce que je ne peux pas (et que vous ne voudriez pas lire de toute façon: P). Mais l'endroit spécifique qui s'est passé ressemble à ceci:
{
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++; });
}
La solution consistait à mettre un if(exportParameters != null)
Avant le bloc de code. exportParameters
est un List<ExportParameter>
, sauf dans le cas d'échec dans lequel il était null
.
La solution
Vous pourriez être confronté au problème sur lequel les régions d'exécution contraises sont conçues pour empêcher - c'est-à-dire que le jetage d'un code sur lequel votre clause Catch s'appuie est à l'origine de la condition hors mémoire.
(En réponse au commentaire de Svish, c'est le premier lien lors de la recherche sur Google la phrase: http://msdn.microsoft.com/en-us/library/ms228973.aspx)
Autres conseils
Mis à part la raison évidente d'obtenir une omexception, vous pouvez également l'obtenir si vous avez toujours de la mémoire disponible, mais pas un morceau assez grand pour ce qui est demandé. Si vous l'obtenez de manière fiable et relativement proche, vous demandez probablement accidentellement plus de mémoire que vous en avez l'intention (c'est-à-dire en demandant un très grand tableau). Pouvez-vous publier un peu de votre code ou au moins décrire votre modèle d'allocation?