2012-04-10 9 views
2
public string getTime() 
    { 
     StringBuilder RetString = new StringBuilder(); 
     RetString.Append(Hours.ToString().PadLeft(2, '0') + "-" + Min.ToString().PadLeft(2, '0') + "-" + AMPM.PadLeft(2, '0')); 
     return RetString.ToString(); 
    } 

Ich versuche, eine Zeit (im String-Format) zurück zu einer Form Zeichenfolge Variable mit dieser. Ich habe den Benutzer eingerichtet, um eine Zeit einzugeben, und die Zeit wird in dieser Klasse gespeichert, und alles, was ich jetzt mache, bringt diese Daten zum Formular, in dem ich arbeite. Ich habe überprüft, dass die Daten in die Klasse gehen und dort gespeichert werden die Variablen.Verwendung von stringbuilder put Zeit in Zeichenfolge (Klasse) C#

Der Fehler, den ich bekommen ist:

CSharp_Null

Nicht wirklich sicher, was das Problem ist. Ich habe die Variablen natürlich erklärt

private int Hours; 
    private int Min; 
    private string AMPM; 

Ich habe Sets Setup erhalten:

public int _hours 
    { 
     get 
     { 
      return Hours; 
     } 
     set 
     { 
      if (value <= 12 && value >= 1) 
      { 
       Hours = value; 
      } 
      else 
       Hours = 0; 
     } 
    } 

    public int _min 
    { 
     get 
     { 
      return Min; 
     } 
     set 
     { 
      if (value <= 59 && value >= 1) 
      { 
       Min = value; 
      } 
      else 
       Min = 0; 
     } 
    } 

    public string ampm 
    { 
     get 
     { 
      return AMPM; 
     } 
     set 
     { 
      if (AMPM == "AM" || AMPM == "PM") 
      { 
       AMPM = value; 
      } 
      else 
       AMPM = ""; 
     } 
    } 

und mein Aufruf der Klasse:

string timefromclass; 
timefromclass = timec.getTime(); 

Das einzige, was ich denke, es könnte wäre mein Anruf in der Klasse, wo ich die Zeit speichern würde

C_Time time = new C_Time(); 

aber in der anderen Form habe ich auch eine andere eingerichtet.

C_Time timec = new C_Time(); 

Möglicherweise versuche ich die Zeit aus einer leeren Instanz abrufen?

EDIT:

public void setTime(int hours, int min, string aMPM) 
    { 
     Hours = hours; 
     Min = min; 
     AMPM = aMPM; 

Das ist wirklich der einzige Ort, wo ich diese Variable etwas zugewiesen.

+0

Wenn Sie die NULL-Referenzausnahme in Visual Studio betrachten, sollten Sie in der Lage sein, das tatsächliche Objekt zu isolieren, das null ist. Das würde Sie in die richtige Richtung weisen. Wie andere wahrscheinlich AMPM gesagt haben. –

+0

Klicken Sie in diesem Fehler auf den Link "Details anzeigen". Irgendwo dort kann es dir genau sagen, mit welcher Variable es ein Problem hat. –

+2

nur eine Randnotiz - Ihr Gehäuse ist etwas aus, basierend auf Standard-C# Konventionen. Öffentliche Methoden und Eigenschaften sollten "PascalCase" sein, während private Mitglieder "camelCase" sein sollten. Die Verwendung von Unterstrichpräfixen gilt normalerweise für private Variablen, Sie verwenden sie jedoch für öffentliche Eigenschaften. –

Antwort

3

Von Ihnen Code, nehme ich an, Ihr AMPM Feld ist null.

Sie scheinen es nicht irgendwo außer dem Setter zu instanziieren, die Sie sind nicht Aufruf in Ihrem Code.

initialisieren sollte das Problem lösen:

private string AMPM = string.Empty; 
+0

Danke! Dies behebt das Problem. : D Jetzt werden die Werte einfach nicht so angezeigt, wie sie sein sollten. –

4

Initialisieren Sie AMPM irgendwo im Code. Wenn nicht, ist es Null (der Standardwert für eine Referenztypvariable) und der Aufruf PadLeft darauf gibt Ihnen eine NRE.

1

Der Fehler, Sie werden immer bedeutet, dass Sie versuchen, eine „Referenz-Typ“ zu lesen, die noch nicht initialisiert wurde und daher null.

int ist ein "Werttyp" und Werttypen können keine Nullwerte darstellen.

String ist ein „Referenz-Typ“ und ist der einzige Referenz-Typ Sie in Ihrer Klasse haben (AMPM). Dies muss dort sein, wo das Problem liegt.

Sie müssen AMPM initialisieren, um den Fehler zu stoppen. Wenn Sie noch keinen haben, ist das Hinzufügen eines Konstruktors zu Ihrer Klasse eine gute Möglichkeit, Initialisierungen zu verarbeiten. Zum Beispiel:

public C_Time() 
{ 
    AMPM = ""; 
} 
1

Wie andere haben darauf hingewiesen, AMPM das Problem ist. Sie sollten es wie diese mit der Eigenschaft

private string _ampm; 

public string AMPM 
{ 
    get 
    { 
     return _ampm ?? ""; // Returns "" if _ampm == null 
    } 
    set 
    { 
     _ampm = value; 
    } 
} 

Dann definieren arbeiten

AMPM.PadLeft(... 

Aber warum nicht einfach

String.Format("{0:00}-{1:00}-{2}", Hours, Min, AMPM.PadLeft(2, '0')); 

verwenden mit Es wäre sicherer zu arbeiten ein enum

public enum AmPm 
{ 
    Undefined, 
    AM, 
    PM 
} 

Damit werden die gültigen Einträge eindeutig aufgelistet. Sonst könnten Sie etwas wie "Nachmittag" oder "Am" anstelle von "AM" eingeben.

Verwandte Themen