代码改变世界

c#中的类型转换,int.parse("ab")为什么会出错

2015-04-07 17:02  二班&张振宇  阅读(1197)  评论(0编辑  收藏  举报

 

一、问题

  

  在一个简单的闰年问题的判断中,输入框获取的字符串,我们希望输入数字字符串,将字符串转换为int整数进行判断。编写程序如下

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {


        }

        private Boolean checkleap(int year)
        {
            bool temp = false;
            if (year % 4 == 0)
            {
                temp = true;
            }
            if (year % 100 == 0)
            {
                temp = false;
            }
            if (year % 400 == 0)
            {
                temp = true;
            }
            return temp;
        }

        private void Form1_Load(object sender, EventArgs e)
        {


        }

        private void button1_Click(object sender, EventArgs e)
        {
            String str = textBox1.Text;
            String str1 = "";
            if (checkleap(int.Parse(str)))
            {
                str1 = "输入年份为闰年";
            }
            else
            {
                str1 = "输入结果不为闰年";
            }
            MessageBox.Show(str1);
        }
    }
}

     但是当我们输入非法字符时 int.parse("ab")抛出异常。

        为什么int.parse("ab")会抛出异常呢?应该怎么处理?

    我们接下来先讨论c#中的几种类型转换

二、 几种类型转换方式。

 

     1.(int) 是一种类型转换,当我们从int类型到long,float,double,decimal类型,可以使用隐式转换,但是当我们从long类型到int类型就需要使用显式转换,否则会产生编译错误

  2.int.Parse()是一种类容转换;表示将数字内容的字符串转为int类型。  

  如果字符串为空,则抛出ArgumentNullException异常;  

  如果字符串内容不是数字,则抛出FormatException异常;  

  如果字符串内容所表示数字超出int类型可表示的范围,则抛出OverflowException异常;

  3、int.TryParse与 int.Parse 又较为类似,但它不会产生异常,转换成功返回 true,转换失败返回 false。  

  最后一个参数为输出值,如果转换失败,输出值为 0,如果转换成功,输出值为转换后的int值

  4、Convert.ToInt32()是一种类容转换;但它不限于将字符串转为int类型,还可以是其它类型的参数;

  比较:Convert.ToInt32 参数为 null 时,返回 0; int.Parse 参数为 null 时,抛出异常。Convert.ToInt32 参数为 "" 时,抛出异常; int.Parse 参数为 "" 时,抛出异常。   Convert.ToInt32 可以转换的类型较多; int.Parse 只能转换数字类型的字符串

 

三、问题分析

  由于输入字符串ab不是数字因此跑出了“FormatException”。

  在类型转换讨论中,我们提到了int.TryParse,或许可以解决问题。

  修改后的关键代码如下:

  

 

 1        private void button1_Click(object sender, EventArgs e)
 2         {
 3             String str = textBox1.Text;
 4             String str1 = "";
 5             int num = 0;
 6             bool temp = int.TryParse(str, out num);
 7             if (temp)
 8             {
 9                 if (checkleap(num))     
10                     str1 = "输入年份为闰年";
11                 else
12                     str1 = "输入结果不为闰年";
13             }
14             else
15             {
16                 str1 = "输入年份格式不正确";
17             }
18             MessageBox.Show(str1);
19         }

  测试用例:

测试用例 预计输出 实际输出
“1234” 输入结果不为闰年 输入结果不为闰年
“2000” 输入结果为闰年 输入结果为闰年
“1900” 输入结果不为闰年   输入结果不为闰年
“abcd” 输入年份格式不正确 输入年份格式不正确
“” 输入年份格式不正确 输入年份格式不正确

  测试截图:

因此我们在以后的编程中,要注重int.Tryparse()的使用,以及对各种情况的考虑。