2015-03-30 34 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

相关问题