2015-03-30 75 views
1

因此,我仍在學習C#,並且遇到了一些問題。我正在製作一個非常簡單的Windows窗體應用程序,帶有兩個文本框,即輸入和輸出,用於從十六進制到十進制的轉換。這裏是我的代碼:C#FormatException將十六進制轉換爲十進制時未處理

 string input = textBox1.Text; 
     int Output = Convert.ToInt32(input, 16); 
     textBox2.Text = Output.ToString(); 

     //Textbox1 is Input 
     //Textbox2 is Output 
+2

我懷疑你的問題是當應用第一次啓動時'textBox1'是空的,並且轉換失敗。當你得到你的異常時,'input'的值是多少?使用調試器查明。 – vcsjones 2015-03-30 21:13:46

回答

0

你到底想幹什麼?簡單的問題是你不能將文本轉換爲數字。我可能沒有得到你想要做的事情。

+0

我的目標是將十六進制字符串轉換爲十進制整數,但事情是,我得到了這個錯誤。我瀏覽了網頁。實際上,Convert.ToInt32與所有其他網站所說的代碼相同。所以我真的不知道發生了什麼:/ – 2015-03-30 21:23:44

3

您可能會遇到兩種例外情況。首先,就像你描述的那樣是一個FormatException。如果輸入的字符串格式不正確,可能會發生這種情況;說它包含一個非十六進制字符,一個空格或其他東西。您遇到的另一個異常是一個溢出異常,當第一個文本框的十六進制數變爲32位整數的數字太大時。

爲了處理異常,你需要一個try catch塊。查看https://msdn.microsoft.com/en-us/library/0yd65esw.aspx瞭解更多關於try catch的信息。

一些錯誤檢查寫這更好的辦法可能看起來像下面的東西:

string input = textBox1.Text; 

try 
{ 
    int Output = Convert.ToInt32(input, 16); 
    textBox2.Text = Output.ToString(); 
} 
catch (FormatException) 
{ 
    MessageBox.Show("Input string is not in the correct format."); 
} 
catch (OverflowException) 
{ 
    MessageBox.Show("Input is too large for conversion."); 
} 

//Textbox1 is Input 
//Textbox2 is Output 

由於Shar1er80和Landepbs人士指出,你所提供的代碼不會出錯,如果你輸入的是正確的。這是您作爲程序員的工作來驗證輸入不會錯誤。您可以使用Shar1er80建議的正則表達式進行錯誤檢查,但也有其他方法。您不僅需要檢查輸入是否包含用於轉換爲十六進制的有效字符,還應該檢查長度。每個十六進制字符可以是16個可能的值之一(0-F)。將它們中的兩個放在一起會產生256個可能的值,或者恰好一個字節。 32位整數是4個字節,這意味着有效輸入的最大長度是8個字符。再多一點,整數就會溢出。

您還應該決定是否要使用帶符號的整數或無符號整數。在有符號整數中,一個位用於符號,因此您可以輸出的最大正整數是無符號整數的一半。您可以閱讀更多關於整數的內容並在https://msdn.microsoft.com/en-us/library/5kzh1b5w.aspx處簽字。

祝你好運學習C#並堅持下去!

+1

如果輸入是一個空字符串,那麼''ArgumentOutOfRangeException''也可能從'Convert.ToInt32()'拋出。 'null'字符串值將被轉換爲'0'。 – 2015-03-30 21:31:51

+1

約翰搖滾。根據文檔,我們應該處理'ArgumentException',我相信它是'ArgumentOutOfRangeException'的基類。 OP,如果您使用Visual Studio並將鼠標懸停在「ToInt32」函數調用上,Intellisense將彈出文檔以及函數可能拋出的異常列表。我將列出的代碼作爲您應該在代碼中處理大部分時間的代碼。這個文檔對於框架功能來說非常可靠,對於第三方代碼來說則更少一些。 – 2015-03-30 21:43:50

+0

是的,這是正確的。聲明如下:'公共類ArgumentOutOfRangeException:ArgumentException,ISerializable'。 – 2015-03-30 21:46:09

相關問題