iT邦幫忙

0

C# 入門作業問題2

c#

大家安,我又來提問了
這次的題目要做簡單的運算
原本我照自己的理解來寫,程式載入到一半就跳出"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);
    }
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
小魚
iT邦大師 1 級 ‧ 2018-10-14 22:18:06

建議用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 ...

看更多先前的回應...收起先前的回應...
h564564 iT邦新手 5 級 ‧ 2018-10-15 00:29:07 檢舉

我改成tryParse成功了 可以問一下convert出錯的原因是大概是甚麼嗎?

小魚 iT邦大師 1 級 ‧ 2018-10-15 07:46:14 檢舉

Convert無法處理例外,
遇到例外程式就會crash,
如果要處理例外你就要在外面包一層try catch,
用catch去處理例外,
我猜微軟可能發現這件事所以加了TryParse這個東西...

優悠 iT邦新手 3 級 ‧ 2018-10-15 09:58:15 檢舉

tryParse若轉換會失敗,將不進行動作,這樣就不會有錯誤訊息,所以就成功了

小魚 iT邦大師 1 級 ‧ 2018-10-15 11:55:09 檢舉

優悠
我猜底層可能也是Try / Catch吧,
要不然怎麼辦到的?

Homura iT邦高手 1 級 ‧ 2018-10-15 16:12:07 檢舉

小魚優悠
好奇去看了一下Source
TraPaser做的動作很多
TraParse()->TryParseInt32()>TryStringToNumber()->
ParseNumber下來
都是用if判斷
判斷不是就回傳false
有興趣可以看看
https://referencesource.microsoft.com/#mscorlib/system/int32.cs,325507e509229dbc

h564564 iT邦新手 5 級 ‧ 2018-10-15 16:53:44 檢舉

感謝 我交出去了/images/emoticon/emoticon12.gif

小魚 iT邦大師 1 級 ‧ 2018-10-15 19:13:16 檢舉

Homura
所以是用字串去判斷,
忽然想到以前寫C++好像也做過這種事...

給原po:tryParse 跟 try catch 是用來做錯誤處理,而不是跳過錯誤
如果程式會發生錯誤但你不知道原因,用 try 跳過是很危險的

小魚 iT邦大師 1 級 ‧ 2018-10-22 19:16:02 檢舉

rainbowrain
你說這個嗎?
https://ithelp.ithome.com.tw/upload/images/20181022/20105694vcSbsXVHkc.jpg

我要發表回答

立即登入回答