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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 严旭晟 高级黑马   /  2015-9-29 22:13  /  7003 人查看  /  29 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
关于if语句不加语句块而直接跟【声明语句】或【定义语句】。
  1. int a = 10;
  2. if( a > 5)
  3.   int x;
  4. 编译出错,为什么?
  5. 它的底层的原因是什么?
  6. 不要复制粘贴,Myeclipse的报错信息。
  7. 如果引用了其他资料,请给出该资料的原始链接。
复制代码


最佳答案

查看完整内容

我其是也不是很清楚,就知道局部变量必须初始化,但是为什么要初始化,我在网上搜了下貌似是跟底层虚拟机对于速度和安全性的考虑,所规定的。以下是大神的原话,可以参考一下。不过我觉得楼主这种刨根问底的精神值得发扬。 局部变量运行时被分配在栈中,量大,生命周期短,如果虚拟机给每个局部变量都初始化一下,是一笔很大的开销,但变量不初始化为默认值就使用是不安全的。出于速度和安全性两个方面的综合考虑,解决方案就 ...

29 个回复

倒序浏览
我其是也不是很清楚,就知道局部变量必须初始化,但是为什么要初始化,我在网上搜了下貌似是跟底层虚拟机对于速度和安全性的考虑,所规定的。以下是大神的原话,可以参考一下。不过我觉得楼主这种刨根问底的精神值得发扬。
    局部变量运行时被分配在栈中,量大,生命周期短,如果虚拟机给每个局部变量都初始化一下,是一笔很大的开销,但变量不初始化为默认值就使用是不安全的。出于速度和安全性两个方面的综合考虑,解决方案就是虚拟机不初始化,但要求编写者一定要在使用前给变量赋值。

点评

精神可嘉  发表于 2015-10-2 17:23
回复 使用道具 举报
编译出错应该是if小括号后边没加分号
回复 使用道具 举报
饰演自己 来自手机 中级黑马 2015-9-30 00:55:55
板凳
严旭晟 发表于 2015-9-29 22:13
关于if语句不加语句块而直接跟【声明语句】或【定义语句】。

要初始化变量
回复 使用道具 举报
饰演自己 来自手机 中级黑马 2015-9-30 01:00:25
报纸
int x=0;初始化一下吧
回复 使用道具 举报
局部变量x必须初始化  
回复 使用道具 举报
本帖最后由 kangyang 于 2015-9-30 08:55 编辑


帮你顶~~
回复 使用道具 举报
穆帆 中级黑马 2015-9-30 09:04:41
8#
1.局部变量X需要初始化。2.if后面的大括号必须加上
回复 使用道具 举报
穆帆 发表于 2015-9-30 09:04
1.局部变量X需要初始化。2.if后面的大括号必须加上

if后如果只跟一个语句是可以省略{}的
回复 使用道具 举报
0.oo~Heart 发表于 2015-9-29 23:18
编译出错应该是if小括号后边没加分号

if后如果只跟一个语句是不用加{}的
回复 使用道具 举报
if语句后面只有一句执行语句的话,大括号可以省略,这个就不用说了。具体底层其实我也不太懂,我就是靠自己的瞎理解。我的理解是这样的:运行程序的顺序是,定义一个变量a为10,开始判断,如果a大于5的话,我们满足这个条件,那就继续运行,定义一个x。那定义x干嘛?x等于几?根本没有意义呀。这你让虚拟机如何给你搞,把这个x给你存在哪?因为这又是个局部变量,一出if语句,x就没有了,存等于没存。就跟for()语句里一样,如果你是int x而没有赋值的话,那如果你打for(x;x<10;x++)这就肯定是个错的了。
回复 使用道具 举报
显而易见,Java的机制和C语言还是有区别的,C语言允许不初始化变量,可是Java是不行的,要切记啊!
回复 使用道具 举报
int x=0;要初始化吧
回复 使用道具 举报
局部变量X需要初始化吧
回复 使用道具 举报
即使初始化了还是错误的,只不过两种错误的类型不一样而已。
回复 使用道具 举报
再者
  1. if(true)
  2.   new Person().show();
  3. 对于引用型变量,匿名的Person()对象此处即使,调用了show()方法,即该对象已经使用了
  4. 还是会报错。
复制代码
回复 使用道具 举报
首先如果只有这个语句是没有编译错误的,你可以不借助编写软件 在doc下直接运行
int a=10;
if(a>5)
int x;
是不会报错了
由于你没有给全代码 我可以做这个判断 你在后面是使用了X的 但是由于是if语句 X可能就没有被定义
而后面又用了X 这样就会导致报错 因为X没有定义
回复 使用道具 举报
无论a是否大于5  java是不会进行判断的 它只会去判断后文的X是否有可能没有被定义
回复 使用道具 举报
好吧,在这里又学会了一点呢:”局部变量必须初始化“
回复 使用道具 举报
没有加花括号,int的值没有初始化
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马