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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵力 中级黑马   /  2012-6-10 12:02  /  8395 人查看  /  18 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. static void Main(string[] args)
  2. {
  3.     Console.WriteLine("瑞年查询,请输入你要查询的年份:");
  4. try
  5. {
  6.     int year= Convert.ToInt32(Console.ReadLine());
  7. }
  8. catch
  9. {
  10.     Console.WriteLine("请输入正确的年份!");
  11. }
  12. if ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0)))
  13.      Console.WriteLine("您输入的年份{0}是一个瑞年", year);
  14. else
  15.     Console.WriteLine("您输入的年份{0}不是一个瑞年", year);
  16. Console.ReadKey();
  17. }
复制代码
这个程序在调试中报错说说变量year不存在。
我很诧异,因为在明明在前面已经定义过了
后来仔细看了下  觉得可能是因为定义在try语句中的原因,把if的那一段放到try下,一试果然可以了
  问下,是不是在try语句中定义的变量就是只能在try语句中使用?这样理解我感觉很别扭 ,是不是其中有其他原因?
  求高手解惑。。。。

评分

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

查看全部评分

18 个回复

倒序浏览
答案就在你的提问中了,try语句块里面一般是不定义变量的,所以你最好把year定义在try语句块的外面,在try语句块里定义的变量只在块中才有效,就像if...else...一样

评分

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

查看全部评分

回复 使用道具 举报
这个问题涉及到 变量的作用域问题。 一般情况下, 我们可以这样考虑,在一对 花括号里定义的变量, 那么出了 那一对花括号 就不能再使用,,
例如:
for (int i= 0 ; i < 5; i++)
{
   .......
}

此处定义的 i 只在 for 语句里生效

static Main(string[] args)
{
int i = 0;
}

此处的i 在 Main 方法里可以使用

for (int i = 0; i <10; i++)
{
   for (int j = 0; j < 3; j++)
  {
   }
}


此处 i 可以再 外层花括号内使用, 而j 只能在 内层 花括号内使用

评分

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

查看全部评分

回复 使用道具 举报
这就涉及到作用域的问题了,局不变量只在本作用域能访问,作用域外不能访问。

评分

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

查看全部评分

回复 使用道具 举报
王继光 发表于 2012-6-10 13:17
这个问题涉及到 变量的作用域问题。 一般情况下, 我们可以这样考虑,在一对 花括号里定义的变量, 那么出 ...

如此,知道了 谢谢
回复 使用道具 举报
定义的变量year   在这个try catch作用域里(局部变量)和if else 不是在同一个作用域的 所以不能用,

定义全局变量,这样就可以了,就是在 try catch  ,if else 之外定义year变量

评分

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

查看全部评分

回复 使用道具 举报
在try catch语句中不可以定义变量,只有将变量定义在该语句之外,然后再该语句中可以给该变量赋值

评分

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

查看全部评分

回复 使用道具 举报
是的,这个是变量的作用域,你try中定义的变量的作用域只适用在try中访问,你多看看变量的作用域这个基础就明白了!

评分

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

查看全部评分

回复 使用道具 举报
呵呵 同意啊  这是变量作用域的问题 !!好好看看视频!
回复 使用道具 举报
这个是作用域的问题,把year定义到开头  (全局变量)if,try都可以用

评分

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

查看全部评分

回复 使用道具 举报
year变量只存在于try块儿中,除了这个块就没有了
要声明的try外面,后面才可以使用

评分

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

查看全部评分

回复 使用道具 举报
把变量year定义在异常语句外面试试看?

评分

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

查看全部评分

回复 使用道具 举报
try catch的作用是用来检错的,你把变量方法都定义在try的外面,再使用try catch结构就没用了。

评分

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

查看全部评分

回复 使用道具 举报
这是一个变量作用域的问题,try catch它是一个用来判断是否出现异常,你在try里面定义的变量year,只能借用year这个变量来帮你判断,判断完了,它也就over!!!!!

评分

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

查看全部评分

回复 使用道具 举报
朱亮辉 发表于 2012-6-10 18:51
是的,这个是变量的作用域,你try中定义的变量的作用域只适用在try中访问,你多看看变量的作用域这个基础就 ...

谢谢~晓得了 记得C语言中在{}内定义的变量在当前函数中是可以用的。。所以这里很疑惑呵呵。~
回复 使用道具 举报
变量的作用域问题。局部变量只在它所在的{}中有效。定义到try的外面就OK。已试。

评分

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

查看全部评分

回复 使用道具 举报
这是变量作用域的问题,try中定义的变量只能在try{}中有效。

评分

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

查看全部评分

回复 使用道具 举报
变量按作用域分为 全局变量  局部变量(分为 模块变量  过程变量   块变量),作用范围从大到小,你的year是块变量,改成过程变量就可以了。

评分

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

查看全部评分

回复 使用道具 举报
始终记得,局部变量的作用范围是离该变量最近的两个配对括号

评分

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

查看全部评分

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