Autor Beitrag
Felix2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 124



BeitragVerfasst: Fr 27.05.11 11:42 
Hallo !

ich habe in meinem folgenden Codebeispiel das Problem, dass eine Null Reference Exception ausgelöst wird. Wie kann ich diese nun sinnvoll abfangen bzw. so abfangen, dass die String Variable den Wert Null (oder einen Leerstring) erhält, wenn das aktuelle Element meines Arrays leer ist (also null ist)?

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
using (StreamWriter writer = new StreamWriter(currentPath_Readed_Values_ISD))
{
   string strCurrentValue = String.Empty;
   foreach (ISDEdi.KonvertPosition isde_di_KONVERT_POSITION in parse.myKonvArray)
   {
      if (isde_di_KONVERT_POSITION != null)
      {
          strCurrentValue += isde_difact_KONVERT_POSITION.se.ToString().Trim() + " | "//hier entsteht diese Exception
                                                           
          writer.WriteLine(strCurrentValue);
      }

   }

}


Danke schön für die Hilfe !

Grüße
Felix
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 27.05.11 12:56 
Dies kannst du ebenso einfach mittels
ausblenden C#-Quelltext
1:
if (isde_di_KONVERT_POSITION.se != null)					

abfangen.
Wenn du jedoch einen Default-Wert haben willst, dann kannst du dafür den ??-Operator ( msdn.microsoft.com/d...ibrary/ms173224.aspx ) benutzen:
ausblenden C#-Quelltext
1:
string s = isde_di_KONVERT_POSITION.se?? "";					

(unter der Annahme, daß 'se' ein string ist, d.h. das ToString() in deinem Code eigentlich überflüssig ist ;-))
Felix2000 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 124



BeitragVerfasst: Fr 27.05.11 13:27 
Hallo !

Danke schön für Deinen Beitrag !

Ein Frage hätte ich aber dennoch nochmal an Dich. Wie genau könnte ich denn das Problem lösen, wenn ich den folgenden C Sharp Code hätte (hier habe ich bereits mal einen Try Catch Finally Block eingebaut, aber es werden hier keine Defaultwerte für die jeweiligen Arrayfelder gesetzt, die null sind (also eben diese Null reference Exception auslösen).

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
using (StreamWriter writer = new StreamWriter(currentPath_Readed_Values_ISD_Q))
{
    string strCurrentValue = String.Empty;

    foreach (ISDEdifact.EDI isde_difact_EDI in parsedi.myEDIArray)
    {
 
       if (isde_difact_EDI != null)
       {

           try
           {

               strCurrentValue = isde_difact_EDI.Nr.ToString().Trim() + " <> ";
               strCurrentValue += isde_difact_EDI.SegmentName.ToString().Trim() + " <> ";
               strCurrentValue += isde_difact_EDI.Zeile.ToString().Trim() + " <> ";

           }
   
           catch (NullReferenceException ex)
           {

                Console.WriteLine("Throwing Null Reference Exception in ISD_Q_EDI, Source: " + ex.Message);
                return;

           }
  
           finally
           {
                writer.WriteLine(strCurrentValue);
           }

       }

    }

}


Besten Dank nochmal für Deine Hilfe und Unterstützung !

Grüße
Felix
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Fr 27.05.11 14:35 
user profile iconFelix2000 hat folgendes geschrieben Zum zitierten Posting springen:
es werden hier keine Defaultwerte für die jeweiligen Arrayfelder gesetzt, die null sind (also eben diese Null reference Exception auslösen).

Du hast ja auch nirgends Standardwerte definiert, soweit ich das sehe. Stattdessen fragst du innerhalb der Schleife ab, ob das Array-Element null ist, und schreibst überhaupt nur für diejenigen, die das nicht sind, eine Zeile in die Datei. Wenn für die null-Elemente ein Standardeintrag hinzugefügt werden soll, müsstest du einen else-Zweit einbauen.

Außerdem ist der try-catch-Block unschön. Erstens sollte man NullReferenceExceptions nicht abfangen, sondern an der jeweiligen Stelle prüfen, ob ein Element null ist. Und zweitens ergibt sich in einer bestimmten Situation ein wahrscheinlich nicht erwartetes verhalten: Ist SegmentName oder Zeile null, wird die Exception ausgelöst, etwas in der Konsole ausgegeben und ein unvollständiger Eintrag in die Datei geschrieben (writer.writeLine steht ja zusätzlich auch noch im finally-Teil). Wenn Nr ein String oder ein anderer nullable ist, könnte es sogar passieren, dass die letzte Zeile oder die eine leere Zeile geschrieben wird, da strCurrentValue noch gar nicht geändert wurde.
Felix2000 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 124



BeitragVerfasst: Fr 27.05.11 15:26 
Hallo nochmal !

Ok, vielen Dank für das Feedback. jetzt habe ich aber nochmal eine Frage:

Wie genau kann ich denn innerhalb einer ForEach Schleife die einzelnen Felder des Arrays ansprechen? Hier nochmal der derzeitige Code:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
using (StreamWriter writer = new StreamWriter(currentPath_Readed_Values_ISD_Q))
{
    string strCurrentValue = String.Empty;

    foreach (ISDEdi isde_di in parsedi.mySEArray)
    {
 
       if (isde_di != null)
       {

           try
           {
               strCurrentValue += isde_di.sGK_Ort.ToString().Trim() + " <> ";
               strCurrentValue += isde_di.sGK_PLZ.ToString().Trim() + " <> ";
               strCurrentValue += isde_di.sGK_Strasse.ToString().Trim() + " <> ";
           }

           catch (NullReferenceException ex)
           {

                Console.WriteLine("Throwing Null Reference Exception in ISD_Q, Source: " + ex.Message);
                return;

           }
           
           finally
           {
                 writer.WriteLine(strCurrentValue);
           }

        }

    }
                 
}


Und so sollte er (ungefähr) aussehen, also ich möchte nicht die einzelnen Felder des Arrays explizit ansprechen, sondern eher anonym via Nummer und das ganz so etwas dynamischer gestalten:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
using (StreamWriter writer = new StreamWriter(currentPath_Readed_Values_ISD_Q))
{
    string strCurrentValue = String.Empty;

    foreach (ISDEdi isde_di in parsedi.mySEArray)
    {
 
       if (isde_di != null)
       {

           try
           {
               strCurrentValue += isde_di.CurrentValue.ToString().Trim() + " <> "//CurrentValue ist ein Pseudocode von mir !!!
           } 

           catch (NullReferenceException ex)
           {

                Console.WriteLine("Throwing Null Reference Exception in ISD_Q, Source: " + ex.Message);
                return;

           }
           
           finally
           {
                 writer.WriteLine(strCurrentValue);
           }

        }

    }
                 
}


Nochmals Danke schön für die Hilfestellungen !

Grüße
Felix
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 27.05.11 15:46 
Zitat:
Und so sollte er (ungefähr) aussehen, also ich möchte nicht die einzelnen Felder des Arrays explizit ansprechen,


Tust du auch gar nicht. Mit deinem Pseudocode greifst du auf eine Property einer Instanz zu die zufällig in einem Array lag. Auf das Array selbst greifst du ja nicht mehr zu. Die Instanz vom ISDEdi Typ selbst ist doch wiederum kein Array oder? Insofern verstehe ich nicht wofür du die Dynamik brauchst. Du weist zur Compilezeit schon das innerhalb der Schleife auf ISDEdi Instanzen zugegriffen wird warum dieses Wissen zur Laufzeit nicht nutzen?
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Fr 27.05.11 16:05 
user profile iconFelix2000 hat folgendes geschrieben Zum zitierten Posting springen:
ich möchte nicht die einzelnen Felder des Arrays explizit ansprechen, sondern eher anonym via Nummer und das ganz so etwas dynamischer gestalten:

Inwiefern ist Dynamik erforderlich? Wo sind Veränderungen möglich? Wie user profile iconRalf Jansen schon geschrieben hat, existiert der Typ ISDEdi schon zur Entwurfszeit und ist daher selbst nicht dynamisch. Wenn Dynamik erwünscht ist, müsstest du dir erst überlegen, wie du den Typ gestalten möchtest. Beispielsweise könntest du ein Dictionary<stringstring> anlegen, in das beliebige Name-Wert-Paare gespeichert werden können. Wenn du das möchtest. Die Frage ist nur, wie viel und wo sich etwas verändern lassen soll.