091502CC8D7F487BA52A08145ED03720
  • Thomas Pollinger
  • 09.03.2018
  • DE/EN

Root Cause Analysis: "ContextLoader.GetObject ... Object reference not set to an instance of an object"

Mit den Anforderungen, wachsen und entstehen ganz tolle Ideen. Vor allem im Projektbau, wenn man die Arbeitsabläufe den Anwendern einfach und effizient gestalten möchte. Jedoch damit steigt auch die Komplexität und die Varianten, in denen eine Fehlermeldung entstehen kann. Wie in diesem Fall ;)


Regel 27

3. Egal, wieviele coole Programmiertricks zu kennst, jemand anderes kennt mehr.:
Wer besseres Programmierwissen hat, teilt es gerne mit, wenn man fragt. Suche immer nach Input von anderen, besonders dann, wenn du denkst, dass du es nicht brauchst. (IT-Professor Frank Bush)


Meldungen

Locals:
Project: {GUID};
ProjectVariant: {GUID};
Language(Page): {GUID};
Page(ID/UUID): {ID};
ContenClass: {GUID};
RenderMode: Preview;
RequestId: 27829; 
System.NullReferenceException: Object reference not set to an instance of an object.
   at Reddot.CMS.Rendering.Objects.ContextLoader.GetPagesObject(Int32& depth, String[] objectArray, IObjectLoadManager objectLoadManager, IPageRenderingContext context)
   at Reddot.CMS.Rendering.Objects.ContextLoader.GetObject(String[] objectArray, IObjectLoadManager objectLoadManager, IPageRenderingContext context)

und dieser Folgefehler, aus der GetPage() Abfrage, wenn man z.B. eine nicht mehr vorhandene Seiten GUID eingetragen (oder auf anderem Wege hinterlegt) hat:

Locals:
Project: {GUID}
ProjectVariant: {GUID};
Language(Page): {GUID};
Page(ID/UUID): {ID};
ContenClass: {GUID};
RenderMode: Preview;
RequestId: 27829; 
System.FormatException: Unrecognized Guid format.
   at System.Guid.GuidResult.SetFailure(ParseFailureKind failure, String failureMessageID, Object failureMessageFormatArgument, String failureArgumentName, Exception innerException)
   at System.Guid.TryParseGuid(String g, GuidStyles flags, GuidResult& result)
   at System.Guid..ctor(String g)
   at Reddot.CMS.Rendering.Objects.GuidLoader.OnGetObject(String[] objectArray, IObjectLoadManager objectLoadManager, IPageRenderingContext context)

Ursache

Diese Meldungen können auftreten, wenn man versucht die angehängten Elemente eines Strukturelements (Anchor, Container oder Liste) abzufragen und es jedoch keine an dieser Instanz bzw. dem Strukturelement gibt.

<reddot:cms>
    <foreach itemname="item" object="Context:Pages.GetPage(Guid:{Page Guid}).GetElementByName(String:containerContent).Value">
        <if>
            <query valuea="Store:item.Template.Name" operator="==" valueb="String:{Content Class Name}">
                <foreach itemname="articles" object="Context:Pages.GetPage(Store:item.Id).GetElementByName(String:containerArticles).Value" countername="counterArticles">
                    <htmltext>...</htmltext>
                </foreach>
            </query>
        </if>
    </foreach>
</reddot:cms>

Lösung

Zuvor noch eine Abfrage mit einem .Count() schalten und prüfen ob dieser größer 0 ist:

<reddot:cms>
    <if>
        <query valuea="Context:Pages.GetPage(Guid:{Page Guid}).GetElementByName(String:containerContent).Value.Count()" operator="!=" valueb="Int:0">
            <foreach itemname="item" object="Context:Pages.GetPage(Guid:{Page Guid}).GetElementByName(String:containerContent).Value">
                <if>
                    <query valuea="Store:item.Template.Name" operator="==" valueb="String:{Content Class Name}">
                        <foreach itemname="articles" object="Context:Pages.GetPage(Store:item.Id).GetElementByName(String:containerArticles).Value" countername="counterArticles">
                            <htmltext>...</htmltext>
                        </foreach>
                    </query>
                </if>
            </foreach>
        </query>
    </if>
</reddot:cms>