一个疑惑的编译错误

努力学习_提高自己 2019-10-21 04:31:56
有代码如下:

public class Hello{
public static void main(String[] args) {
int a;
if (a == 8) {
int b = 9;
System.out.println("a=" + a);
System.out.println("b=" + b);
}
System.out.println("a=" + a);
System.out.println("b="+ b);
}
}

照理来说,局部变量a未初始化,if判断那里应该报错,但实际上编译结果却是:


而如果把这一行代码删除掉,那么编译时就和前面想的一样的错误:


请问各位,这是为什么呢?
...全文
165 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_39936465 2019-11-04
  • 打赏
  • 举报
回复
引用 12 楼 为了小豆丁我要好好锻炼 的回复:
麻烦请看下我一开始的描述,如果把访问b的语句注释掉,那么变量没有初始化的错误也是在编译时发生的。
可能我表达错误,不过”变量先申明在使用“这句话你总听说过吧,就是表达的变量使用过程中的优先级别。变量首先要申明,才能让机器知道变量是什么类型的变量这个很关键,不同类型的变量保存位置,调用方式是不同的。但是变量是否被初始化,不一定能够编译过程及时发现的问题。所以这里明显优先级别不同(你这里因为是基础类型所以会被编译程序发现错误,如果不是基础类型,编译程序不一定能发现)
IT_熊 2019-11-01
  • 打赏
  • 举报
回复
这个就是变量作用域问题,局部变量局部有效,if调节里面的声明的变量,条件外是不能使用的,可以这么理解:if条件里面如果不满足,那么久没有这个变量,没有这个变量那么后面就不能用这个变量了。
  • 打赏
  • 举报
回复
引用 10 楼 茶里寻禅 缘法自然 的回复:
public class Hello{ public static void main(String[] args) { int a; ---并且这里要初始化 if (a == 8) { int b = 9; System.out.println("a=" + a); System.out.println("b=" + b); } System.out.println("a=" + a); System.out.println("b="+ b); ----这个b 是在if内定义的。if外是获取不到的 } } 问题优先 变量b找不到符号,是因为b的错误等级比 a未初始化的等级高。取决于, if不满足可以直接为false,就直接执行下面 b错误的地方
这种解释看来应该是合理的,如果再深一点,我觉得得看javac的源码,看看它编译时到底是先做了什么判断
  • 打赏
  • 举报
回复
引用 11 楼 qq_39936465 的回复:
[quote=引用 8 楼 为了小豆丁我要好好锻炼 的回复:] 现象上看貌似是这样,有没有官方的材料证明的?
这个不需要官方证明材料,先申明再使用,你学编程没听过这句话吗?你没有申明变量编译时候就报错了,变量没有初始化是在执行过程中发生的。[/quote] 麻烦请看下我一开始的描述,如果把访问b的语句注释掉,那么变量没有初始化的错误也是在编译时发生的。
qq_39936465 2019-10-30
  • 打赏
  • 举报
回复
引用 8 楼 为了小豆丁我要好好锻炼 的回复:
现象上看貌似是这样,有没有官方的材料证明的?


这个不需要官方证明材料,先申明再使用,你学编程没听过这句话吗?你没有申明变量编译时候就报错了,变量没有初始化是在执行过程中发生的。
  • 打赏
  • 举报
回复
public class Hello{ public static void main(String[] args) { int a; ---并且这里要初始化 if (a == 8) { int b = 9; System.out.println("a=" + a); System.out.println("b=" + b); } System.out.println("a=" + a); System.out.println("b="+ b); ----这个b 是在if内定义的。if外是获取不到的 } } 问题优先 变量b找不到符号,是因为b的错误等级比 a未初始化的等级高。取决于, if不满足可以直接为false,就直接执行下面 b错误的地方
  • 打赏
  • 举报
回复
public class Hello{ public static void main(String[] args) { int a; if (a == 8) { int b = 9; System.out.println("a=" + a); System.out.println("b=" + b); } System.out.println("a=" + a); System.out.println("b="+ b); ----这个b 是在if内定义的。if外是获取不到的 } }
  • 打赏
  • 举报
回复
引用 2 楼 qq_39936465 的回复:
[quote=引用 楼主 为了小豆丁我要好好锻炼 的回复:] 有代码如下: [code=java] 照理来说,局部变量a未初始化,if判断那里应该报错,但实际上编译结果却是: 而如果把这一行代码删除掉,那么编译时就和前面想的一样的错误: 请问各位,这是为什么呢?
编译程序先判断变量是否被申明过,然后才会判断变量是否被初始化[/quote] 现象上看貌似是这样,有没有官方的材料证明的?
  • 打赏
  • 举报
回复
引用 1 楼 usecf 的回复:
个人认为编译器做过类似的优化操作,比如优先级之类的 错误比警告的优先级高 所以先识别出错误
然而对于Java来说,这两都是错误呀
  • 打赏
  • 举报
回复
引用 5 楼 阿发你好 的回复:
新人建议用专业的开发工具来学,事半功倍 这里有免安装的eclipse,解压缩即用。 https://share.weiyun.com/5BhHB5v https://pan.baidu.com/s/1Tr6tNBf0Qco0I53QSwvpmA
Eclipse里也是一样的问题,你可以试试看
阿发你好 2019-10-21
  • 打赏
  • 举报
回复
新人建议用专业的开发工具来学,事半功倍 这里有免安装的eclipse,解压缩即用。 https://share.weiyun.com/5BhHB5v https://pan.baidu.com/s/1Tr6tNBf0Qco0I53QSwvpmA
wowpH 2019-10-21
  • 打赏
  • 举报
回复
错误优先级不同?
qq_39936465 2019-10-21
  • 打赏
  • 举报
回复
你程序里int b 申明的是局部变量,全局未申明所以先报错。
qq_39936465 2019-10-21
  • 打赏
  • 举报
回复
引用 楼主 为了小豆丁我要好好锻炼 的回复:
有代码如下: [code=java] 照理来说,局部变量a未初始化,if判断那里应该报错,但实际上编译结果却是: 而如果把这一行代码删除掉,那么编译时就和前面想的一样的错误: 请问各位,这是为什么呢?
编译程序先判断变量是否被申明过,然后才会判断变量是否被初始化
usecf 2019-10-21
  • 打赏
  • 举报
回复
个人认为编译器做过类似的优化操作,比如优先级之类的 错误比警告的优先级高 所以先识别出错误

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧