Ich bin neu in C #, habe einige Grundkenntnisse in Java, kann diesen Code jedoch nicht ordnungsgemäß ausführen.
Es ist nur ein einfacher Taschenrechner, aber wenn ich das Programm VS2008 ausführe, wird folgende Fehlermeldung angezeigt:
Ich habe fast das gleiche Programm gemacht, aber in Java mit JSwing und es hat perfekt funktioniert.
Hier ist die Form von c #:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace calculadorac
{
public partial class Form1 : Form
{
int a, b, c;
String resultado;
public Form1()
{
InitializeComponent();
a = Int32.Parse(textBox1.Text);
b = Int32.Parse(textBox2.Text);
}
private void button1_Click(object sender, EventArgs e)
{
add();
result();
}
private void button2_Click(object sender, EventArgs e)
{
substract();
result();
}
private void button3_Click(object sender, EventArgs e)
{
clear();
}
private void add()
{
c = a + b;
resultado = Convert.ToString(c);
}
private void substract()
{
c = a - b;
resultado = Convert.ToString(c);
}
private void result()
{
label1.Text = resultado;
}
private void clear()
{
label1.Text = "";
textBox1.Text = "";
textBox2.Text = "";
}
}
Was kann das Problem sein? Gibt es einen Weg, es zu lösen?
PS: Ich habe es auch versucht
a = Convert.ToInt32(textBox1.text);
b = Convert.ToInt32(textBox2.text);
und es hat nicht funktioniert.
quelle
Ich bin genau auf diese Ausnahme gestoßen, außer dass sie nichts mit dem Parsen numerischer Eingaben zu tun hatte. Dies ist also keine Antwort auf die Frage des OP, aber ich denke, es ist akzeptabel, das Wissen zu teilen.
Ich hatte eine Zeichenfolge deklariert und formatierte sie für die Verwendung mit JQTree, für das geschweifte Klammern ({}) erforderlich sind. Sie müssen doppelte geschweifte Klammern verwenden, damit es als richtig formatierte Zeichenfolge akzeptiert wird:
string measurements = string.empty; measurements += string.Format(@" {{label: 'Measurement Name: {0}', children: [ {{label: 'Measured Value: {1}'}}, {{label: 'Min: {2}'}}, {{label: 'Max: {3}'}}, {{label: 'Measured String: {4}'}}, {{label: 'Expected String: {5}'}}, ] }},", drv["MeasurementName"] == null ? "NULL" : drv["MeasurementName"], drv["MeasuredValue"] == null ? "NULL" : drv["MeasuredValue"], drv["Min"] == null ? "NULL" : drv["Min"], drv["Max"] == null ? "NULL" : drv["Max"], drv["MeasuredString"] == null ? "NULL" : drv["MeasuredString"], drv["ExpectedString"] == null ? "NULL" : drv["ExpectedString"]);
Hoffentlich hilft dies anderen Leuten, die diese Frage finden, aber keine numerischen Daten analysieren.
quelle
Wenn Sie nicht explizit nach Zahlen im Textfeld suchen, ist es auf jeden Fall besser, diese zu verwenden
int result=0; if(int.TryParse(textBox1.Text,out result))
Wenn das Ergebnis nun erfolgreich ist, können Sie mit Ihren Berechnungen fortfahren.
quelle
result
normalerweise nicht initialisiert werden.Probleme
Es gibt einige mögliche Fälle, in denen der Fehler auftritt:
Da
textBox1.Text
enthält nur Zahl, aber die Zahl ist zu groß / zu kleinWeil
textBox1.Text
enthält:space
am Anfang / Ende,-
am Anfang) und / oderNumberStyles.AllowThousands
oder Angabe,NumberStyles.AllowThousands
aber falschthousand separator
in der Kultur und / oderint
Parsen nicht vorhanden sein sollte )NICHT OK Beispiele:
Fall 1
a = Int32.Parse("5000000000"); //5 billions, too large b = Int32.Parse("-5000000000"); //-5 billions, too small //The limit for int (32-bit integer) is only from -2,147,483,648 to 2,147,483,647
Fall 2 a)
a = Int32.Parse("a189"); //having a a = Int32.Parse("1-89"); //having - but not in the beginning a = Int32.Parse("18 9"); //having space, but not in the beginning or end
Fall 2 b)
NumberStyles styles = NumberStyles.AllowThousands; a = Int32.Parse("1,189"); //not OK, no NumberStyles.AllowThousands b = Int32.Parse("1,189", styles, new CultureInfo("fr-FR")); //not OK, having NumberStyles.AllowThousands but the culture specified use different thousand separator
Fall 2 c)
NumberStyles styles = NumberStyles.AllowDecimalPoint; a = Int32.Parse("1.189", styles); //wrong, int parse cannot parse decimal point at all!
Scheinbar NICHT OK, aber eigentlich OK Beispiele:
Fall 2 a) OK
a = Int32.Parse("-189"); //having - but in the beginning b = Int32.Parse(" 189 "); //having space, but in the beginning or end
Fall 2 b) OK
NumberStyles styles = NumberStyles.AllowThousands; a = Int32.Parse("1,189", styles); //ok, having NumberStyles.AllowThousands in the correct culture b = Int32.Parse("1 189", styles, new CultureInfo("fr-FR")); //ok, having NumberStyles.AllowThousands and correct thousand separator is used for "fr-FR" culture
Lösungen
Überprüfen Sie in jedem Fall den Wert von
textBox1.Text
mit Ihrem Visual Studio-Debugger und stellen Sie sicher, dass er ein rein akzeptables numerisches Format für denint
Bereich hat. Etwas wie das:1234
Sie können auch in Betracht ziehen
TryParse
anstelle von,Parse
um sicherzustellen, dass die nicht analysierte Nummer kein Ausnahmeproblem verursacht.Überprüfen Sie das Ergebnis von
TryParse
und behandeln Sie es, wenn nichttrue
int val; bool result = int.TryParse(textbox1.Text, out val); if (!result) return; //something has gone wrong //OK, continue using val
quelle
Sie haben nicht erwähnt, ob Ihr Textfeld Werte in der Entwurfszeit oder jetzt hat. Wenn das Formular initialisiert wird, hat das Textfeld möglicherweise keinen Wert, wenn Sie es während des Formularentwurfs nicht in das Textfeld eingefügt haben. Sie können den int-Wert in das Formular-Design einfügen, indem Sie die Texteigenschaft in desgin festlegen. Dies sollte funktionieren.
quelle
In meinem Fall habe ich vergessen, eine doppelte geschweifte Klammer zu setzen, um zu entkommen. {{myobject}}
quelle
Es war auch mein Problem. In meinem Fall habe ich die PERSISCHE Nummer in LATEINISCHE Nummer geändert und es hat funktioniert. UND schneiden Sie Ihren String auch vor dem Konvertieren ab.
PersianCalendar pc = new PersianCalendar(); char[] seperator ={'/'}; string[] date = txtSaleDate.Text.Split(seperator); int a = Convert.ToInt32(Persia.Number.ConvertToLatin(date[0]).Trim());
quelle
Ich hatte ein ähnliches Problem, das ich mit der folgenden Technik gelöst habe:
Die Ausnahme wurde in der folgenden Codezeile ausgelöst (siehe den mit ** unten verzierten Text):
static void Main(string[] args) { double number = 0; string numberStr = string.Format("{0:C2}", 100); **number = Double.Parse(numberStr);** Console.WriteLine("The number is {0}", number); }
Nach einigem Nachforschen stellte ich fest, dass das Problem darin bestand, dass die formatierte Zeichenfolge ein Dollarzeichen ($) enthielt, das die Parse / TryParse-Methoden nicht auflösen können (dh entfernen). Also habe ich mit der Remove (...) -Methode des String-Objekts die Zeile geändert in:
number = Double.Parse(numberStr.Remove(0, 1)); // Remove the "$" from the number
Zu diesem Zeitpunkt funktionierte die Parse (...) -Methode wie erwartet.
quelle