大家安,我又來提問了
這次的題目要做簡單的運算
原本我照自己的理解來寫,程式載入到一半就跳出"System.FormatException: '輸入字串格式不正確。'"
再試了幾小時後,我決定照課本打(除了除錯try and catch),結果還是跳出同樣的訊息,所以來向大家發問
以下是我的程式碼
private void Form1_Load(object sender, EventArgs e)
{
textBox2.Text = "0";
textBox2.Focus();
}
private void textBox2_Enter(object sender, EventArgs e)
{
textBox2.Text = "";
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
int sum;
sum = Convert.ToInt32(textBox1.Text) * Convert.ToInt32(textBox2.Text);
textBox3.Text = Convert.ToString(sum);
}
建議用try catch包起來,
然後你也要說一下錯誤在哪一行,
雖然看起來應該是Convert.ToInt32出錯,
如果是無法轉換的文字就會噴錯了...
這有很多種處理方式,
我寫一種我常用的出來就好.
int sum = 0, num1 = 0, num2 = 0;
Int32.TryParse(textBox1.Text, out num1);
Int32.TryParse(textBox2.Text, out num2);
sum = num1 * num2;
Int32.TryParse會回傳bool,
如果要判斷格式錯誤可以在前面加上if判斷
if(!Int32.TryParse(textBox1.Text, out num1))
{
MessageBox.Show("請輸入數字");
return;
}
之類的,
如果無法轉換後面的數字就會是0,
然後我很少用Convert.ToString,
印象中在某些狀況下會噴錯,
我習慣用sum.ToString();
基本上除了sum是null的情況以外都不會噴錯,
不過C#的int不允許null ...
我改成tryParse成功了 可以問一下convert出錯的原因是大概是甚麼嗎?
Convert無法處理例外,
遇到例外程式就會crash,
如果要處理例外你就要在外面包一層try catch,
用catch去處理例外,
我猜微軟可能發現這件事所以加了TryParse這個東西...
tryParse若轉換會失敗,將不進行動作,這樣就不會有錯誤訊息,所以就成功了
優悠
我猜底層可能也是Try / Catch吧,
要不然怎麼辦到的?
小魚優悠
好奇去看了一下Source
TraPaser做的動作很多
從TraParse()
->TryParseInt32()
>TryStringToNumber()
->ParseNumber
下來
都是用if判斷
判斷不是就回傳false
有興趣可以看看
https://referencesource.microsoft.com/#mscorlib/system/int32.cs,325507e509229dbc
感謝 我交出去了
Homura
所以是用字串去判斷,
忽然想到以前寫C++好像也做過這種事...
給原po:tryParse 跟 try catch 是用來做錯誤處理,而不是跳過錯誤
如果程式會發生錯誤但你不知道原因,用 try 跳過是很危險的
rainbowrain
你說這個嗎?