Warum bekomme ich eine FormatException wurde nicht behandelte Fehler?
Habe ich ein Programm erstellt, und einen umfangreichen test von es, ich bin immer eine Fehlermeldung, die sagt "FormatException wurde nicht behandelte, die Eingabezeichenfolge hat das falsche format". Das problem tritt auf, wenn ich verlassen, die entweder von der Textfelder und drücken Sie die 'Fertig' - Taste, aber es funktioniert gut, wenn ich geben Sie etwas unterhalb von 0 oder oberhalb von 59 - das ist die Zahl, die ich zulassen will. Was könnte ich tun, damit ich nicht diese Fehlermeldung, wenn die Felder leer sind? Das ist mein code hinter 'btnFinished':
private void btnFinished_Click(object sender, EventArgs e)
{
if (lstCyclists.SelectedIndex >= 0)
{
Cyclists currentCyc = (Cyclists)lstCyclists.SelectedItem;
//Decalre the minsEntered and secsEntered variables for txtMins and textSecs
int minsEntered = int.Parse(txtMins.Text);
int secsEntered = int.Parse(txtSecs.Text);
try
{
//If the status of a cyclist is already set to Finished, show an error
if (currentCyc.Finished.ToString() == "Finished")
{
MessageBox.Show("A time has already been entered for this cyclist");
}
else
{
//if a minute lower than 0 or greater than 59 has been entered, show an error
if (minsEntered < 0 || minsEntered > 59)
{
MessageBox.Show("You can only enter a minute up to 59");
}
//if a second lower than 0 or greater than 59 has been entered, show an error
else if (secsEntered < 0 || secsEntered > 59)
{
MessageBox.Show("You can only enter a second up to 59");
}
else
{
//otherwise, set the status to finished and update the time
currentCyc.Finished = "Finished";
currentCyc.FinishedHours(Convert.ToInt32(txtHours.Text));
currentCyc.FinishedMins(Convert.ToInt32(txtMins.Text));
currentCyc.FinishedSecs(Convert.ToInt32(txtSecs.Text));
//pass the parameter to the scoreboard class to display it in lblCyclistsFinished
lblCyclistsFinished.Text += "\n" + finishLine.Scoreboard(currentCyc);
//add to the number of cyclists finished
Cyclists.NumFinished++;
lblnumFinished.Text = Cyclists.NumFinished.ToString();
//update the details box
DisplayDetails(currentCyc);
txtHours.Clear();
}
}
}
catch
//make sure all the time fields have been entered, otherwise show an error message
{
MessageBox.Show("Please ensure all time fields have been entered");
}
}
else
//make sure a cyclist has been selected when pressing "Finished", otherwise show an error message
{
MessageBox.Show("You must select a cyclist");
}
}
- Referenz nächste mal, wenn Sie eine Frage stellen, es wäre sehr hilfreich, wenn man genau die Zeilen zu werfen waren der Fehler.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, Blick auf diese Zeilen:
Was tun Sie erwarten diejenigen, die zurückkehren, wenn die Textfelder leer sind?
Einfach nicht nennen
int.Parse
für leere Textfelder. Zum Beispiel:Natürlich, das wird noch gehen Knall, wenn Sie eine Eingabe nicht numerisch ist. Sie sollten wahrscheinlich mit
int.TryParse
statt:Hier bin ich Ignoriere das Ergebnis
TryParse
, und es wird verlassenminsEntered
0 sowieso - aber wenn Sie wollten, einen anderen Standard, die Sie verwenden würden, so etwas wie:(Oder Sie können eine Fehlermeldung anzeigen, in diesem Fall...)
TryParse
? Wäre das besser?Dass ist das Problem. Sie sind mit
int.Parse
auf eine leere Zeichenfolge. Ein leerer string ist kein Gültiger integer-Darstellung und das Parsen fehlschlägt.Können Sie testen, für die ein Wert in die textbox und Standard zu etwas sinnvollem statt:
Könnte man mit int.TryParse, das gibt ein boolescher Wert, der angibt, ob der text war erfolgreich analysiert: