A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李承伟 初级黑马   /  2012-7-31 10:27  /  3457 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image002.jpg
Console.ReadLine() 是让用户输入字符串,而当输入的语文成绩为90时,不会跳到catch里面执行,当输入的比如90b时,就跳到catch中执行,提示输入有错误,我所不解的就是为什么会这样?是不是由Console.ReadLine() 前面的ToInt进行一个判断,是不是符合我所要输入的?

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

15 个回复

倒序浏览
抱歉,截图:

未命名.jpg (55.63 KB, 下载次数: 303)

未命名.jpg
回复 使用道具 举报
本帖最后由 许庭洲 于 2012-7-31 10:39 编辑

程序发生异常是由于用户输入了非法的数据,由于该数据不是int类型的,90b是混合类型,函数Convert.ToInt32(90b)没法将90b转化为整型数据,程序会抛出异常;

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
catch是扑捉异常的,Toint()是转化类型的,当你被转的字符含有特殊字符,Toint()就不能转了,由于Toint()没有处理异常的功能,所以就会报错,导致程序终止,但是使用try{}catch{}就会扑捉异常,不会导致程序终止,
像你这种情况推荐使用TryParse()尝试转化,如果转化失败就返回false,成功转化返回true;

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
上面回答差不多了,我补充一点:
Convert.ToInt32 与 int.Parse 较为类似,实际上 Convert.ToInt32 内部调用了 int.Parse:
Convert.ToInt32 参数为 null 时,返回 0;
int.Parse 参数为 null 时,抛出异常。

Convert.ToInt32 参数为 "" 时,抛出异常;
int.Parse 参数为 "" 时,抛出异常。

Convert.ToInt32 可以转换的类型较多;
int.Parse 只能转换数字类型的字符串。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
你输入的是一个字符串是吧,convert.toint是把你输入的字符串转换为一个整型的数据,转换失败就会报错,就会被catch抓住。如果使用int.tryparse应该就不会报错了吧,你试试。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
Convert.ToInt32(Console.WriteLine()),当输入的字符串含有字母或者不能被转换成Int32整数时,就会抛出异常,进入catch代码段。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
刘玉 中级黑马 2012-7-31 12:13:01
8#
转换失败当然异常了

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
王峰 中级黑马 2012-7-31 16:55:59
9#
catch是用来异常捕获啊,当字符串不能被转换成Int32整数时,就会抛出异常,既然出现异常,当然要进入进入catch代码段进行异常处理了,,,

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
感觉这样的问题最好还是用int.Parse (),try {}catch{ }是在可能产生无法预知的错误时才用的,视频里也是建议少用try catch的

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
建议你试试int.TryParse()去试着转换,这个比Convert.ToInt32好用一点

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
Suko 初级黑马 2012-7-31 22:17:47
12#
如果想要从字符串转换成某个类型的数据,最好的方式是使用这个类型的TryParse()方法。
DateTime date = new DateTime();
            if (DateTime.TryParse(input, out date))
            {
            }
TryParse方法会对字符串进行解析,并且返回是否解析成功。不需要手动throw异常如果解析成功,out的date会被成功赋值。否则,date不变。int,double,等很多基本数据类型还有枚举类型都有这个方法。请尝试使用。而使用Convert的坏处就是,需要手动throw 异常。否则,会造成程序停止运行。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
Convert.ToInt32(字符串) 字符串要为数字格式,否则就会抛出异常,执行catch语句。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
捕获异常是为了方式用户恶意的使用不规范的代码导致程序的崩溃和错误的添加引起的数据库混乱,
例如  你想要输入 年龄  你输入的是36   但是用户偏偏输一些 非整形数字之类的 如a68 这样的数据添加到数据库中会非常的麻烦

所以在一些敏感的数据转换 前 考虑好转换的安全性 实时的添加一些try catch对象捕获异常  

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
Convert.ToInt32()会把输入的数据转换成32位整型,如果转换失败,就会抛出异常。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
90b不是所要求的数据类型 故而转换失败

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马