java 循环 为什么for或报错而while不会

mjdyuyu 2017-12-16 03:02:36
如图:



for是个死循环却报错了,而while却没有报错,为什么?
哪位大神能具体分析解释一下么?谢谢,mu ~~~~~ma!~
...全文
1028 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2017-12-19
  • 打赏
  • 举报
回复
首先是for(;;)不是if(;;),这样提问很容易让人误解。 for(;;); System.out.println(); 会报错是因为编译器能推导出println永远不会执行到; 而 int n = 1; while (n > 0); System.out.println(); 不会报错是因为编译器不知道while是个死循环(因为它不知道n的值),虽然你知道这是个死循环。 你可以试试: public class Foo { public static void main(String[] args) { final int n = 1; while (n > 0) ; System.out.println("hello, world!"); } } 现在编译器知道n的值了,也可以推导出while是个死循环了,所以可以判断出println不会被执行到,报错。
maradona1984 2017-12-19
  • 打赏
  • 举报
回复
引用 20 楼 hemowolf 的回复:
[quote=引用 18 楼 mjdyuyu 的回复:] 这个是我做的一道题,问那个会编译错误,我知道for(;;){}会报错,但是不知道是为什么,所以请教一下,上面 自由自在_Yu 说错了,while(n>0) ; 也是死循环 我就是不明白为什么会编译错误,能有个大神指点说明一下么?
n 是一个变量,它存在 n <= 1 的可能 当然这个“可能”从你的程序里看是不会发生的,但Java编译器做的检查也就到此为止了 要知道,想要完整地判断这个 while 循环是否为死循环,必须明确: 1、n 一定是这个方法里的局部变量,因为如果是类的成员变量,或者类的静态变量,则它的值有可能被其它的线程修改,如此一来while就不是死循环了 2、在进入while之前,n 的最后一次赋值,一定是在编译期就可以确定的值,它不可以是通过方法返回的值,比如出现了 int n = 1; ...... n = method(); while(n > 1){ } 这时method 方法可能返回0,从而直接跳过while循环 3、while 中的条件也是明确的,比如还有一个全局性的变量 int a = 100; while(n > a){ } 这时 n 的值虽然永远是1,但是可能其它线程会改变 a 的值,导致 while 条件检查返回false,从而跳出循环 也就是说,编译器还得判断这个 while 里是否用到了非局部性的变量 …… 其它的原因暂时想不到了 当然,上述的这些判断 java 编译器应该都是可以做到的,但是为了找出你的程序中的这些个小毛病,付出的代价也太大了点吧。这些bug应该留给程序员自己去找。[/quote] 你把int n =1;改成final int n = 1;结果不一样 编译期能确定final修饰的变量不变,所以也能确定n>0为true,如果没有final修饰,变量可能会变化,但编译器并不会去"理解"你的代码,所以可以编译成功
maradona1984 2017-12-19
  • 打赏
  • 举报
回复

while(n>0){
			
}
其实等于于

		for(;n>0;){
			
		}
而不是

		for(;;){
			
		}
小灰狼 2017-12-19
  • 打赏
  • 举报
回复
引用 18 楼 mjdyuyu 的回复:
这个是我做的一道题,问那个会编译错误,我知道for(;;){}会报错,但是不知道是为什么,所以请教一下,上面 自由自在_Yu 说错了,while(n>0) ; 也是死循环 我就是不明白为什么会编译错误,能有个大神指点说明一下么?
n 是一个变量,它存在 n <= 1 的可能 当然这个“可能”从你的程序里看是不会发生的,但Java编译器做的检查也就到此为止了 要知道,想要完整地判断这个 while 循环是否为死循环,必须明确: 1、n 一定是这个方法里的局部变量,因为如果是类的成员变量,或者类的静态变量,则它的值有可能被其它的线程修改,如此一来while就不是死循环了 2、在进入while之前,n 的最后一次赋值,一定是在编译期就可以确定的值,它不可以是通过方法返回的值,比如出现了 int n = 1; ...... n = method(); while(n > 1){ } 这时method 方法可能返回0,从而直接跳过while循环 3、while 中的条件也是明确的,比如还有一个全局性的变量 int a = 100; while(n > a){ } 这时 n 的值虽然永远是1,但是可能其它线程会改变 a 的值,导致 while 条件检查返回false,从而跳出循环 也就是说,编译器还得判断这个 while 里是否用到了非局部性的变量 …… 其它的原因暂时想不到了 当然,上述的这些判断 java 编译器应该都是可以做到的,但是为了找出你的程序中的这些个小毛病,付出的代价也太大了点吧。这些bug应该留给程序员自己去找。
小灰狼 2017-12-19
  • 打赏
  • 举报
回复
引用 4 楼 mjdyuyu 的回复:
唉,啥B了,是这个,
for(;;){ } 是死循环,永远跳不出去,所以后面的代码都执行不了,报的是这个错
mjdyuyu 2017-12-19
  • 打赏
  • 举报
回复
谢谢小灰狼 跟 ForestDB 俩位大佬的指点
小灰狼 2017-12-19
  • 打赏
  • 举报
回复
引用 22 楼 maradona1984 的回复:
[quote=引用 20 楼 hemowolf 的回复:] [quote=引用 18 楼 mjdyuyu 的回复:] 这个是我做的一道题,问那个会编译错误,我知道for(;;){}会报错,但是不知道是为什么,所以请教一下,上面 自由自在_Yu 说错了,while(n>0) ; 也是死循环 我就是不明白为什么会编译错误,能有个大神指点说明一下么?
n 是一个变量,它存在 n <= 1 的可能 当然这个“可能”从你的程序里看是不会发生的,但Java编译器做的检查也就到此为止了 要知道,想要完整地判断这个 while 循环是否为死循环,必须明确: 1、n 一定是这个方法里的局部变量,因为如果是类的成员变量,或者类的静态变量,则它的值有可能被其它的线程修改,如此一来while就不是死循环了 2、在进入while之前,n 的最后一次赋值,一定是在编译期就可以确定的值,它不可以是通过方法返回的值,比如出现了 int n = 1; ...... n = method(); while(n > 1){ } 这时method 方法可能返回0,从而直接跳过while循环 3、while 中的条件也是明确的,比如还有一个全局性的变量 int a = 100; while(n > a){ } 这时 n 的值虽然永远是1,但是可能其它线程会改变 a 的值,导致 while 条件检查返回false,从而跳出循环 也就是说,编译器还得判断这个 while 里是否用到了非局部性的变量 …… 其它的原因暂时想不到了 当然,上述的这些判断 java 编译器应该都是可以做到的,但是为了找出你的程序中的这些个小毛病,付出的代价也太大了点吧。这些bug应该留给程序员自己去找。[/quote] 你把int n =1;改成final int n = 1;结果不一样 编译期能确定final修饰的变量不变,所以也能确定n>0为true,如果没有final修饰,变量可能会变化,但编译器并不会去"理解"你的代码,所以可以编译成功[/quote] 把 int n = 1 改为 final int n = 1; 之后 while(n > 0) 可以被编译器优化为 while(1 > 0),并进一步优化为 while(true)
强迫症患者 2017-12-18
  • 打赏
  • 举报
回复
主要是 if 和for 太像了.... 不是while 和for 的锅
mjdyuyu 2017-12-18
  • 打赏
  • 举报
回复
这个是我做的一道题,问那个会编译错误,我知道for(;;){}会报错,但是不知道是为什么,所以请教一下,上面 自由自在_Yu 说错了,while(n>0) ; 也是死循环 我就是不明白为什么会编译错误,能有个大神指点说明一下么?
繁华终归落尽 2017-12-18
  • 打赏
  • 举报
回复
自由自在_Yu 2017-12-18
  • 打赏
  • 举报
回复
public static void main(String[] args) {
		 int n = 1;
		 
		 while(n > 0){ //n=1满足条件,只会输出一次,不是死循环
			 System.out.println(n);
		 }
		 
		 for(;;){ //死循环
			 System.out.println(n);
		 }
		 //System.out.println(n); //上面是死循环,一直停留在上面一步,不可能执行到这儿
		 
	}
yannsPeng 2017-12-18
  • 打赏
  • 举报
回复
学python吧,出来搞机器学习。
yannsPeng 2017-12-18
  • 打赏
  • 举报
回复
java饱和了。
WorkLee 2017-12-18
  • 打赏
  • 举报
回复
这代码写的,看见了直接懵逼状态,for循环值当的这么省?!典型看视频来的?!还要,你那输出是不是得放循环里面!!!????
浪潮--人中龙 2017-12-18
  • 打赏
  • 举报
回复
这就设计for和while的基础知识了
星灬 2017-12-18
  • 打赏
  • 举报
回复
和我初学时很像
Bestprotect 2017-12-18
  • 打赏
  • 举报
回复
你是python派来的卧底吧
钢琴上的代码 2017-12-18
  • 打赏
  • 举报
回复
for里面什么都不写,应该是一直死循环,所以编译器认为根本就不会执行到那行输出语句.所以你写了就编译不通过
懒笑翻 2017-12-18
  • 打赏
  • 举报
回复
测试while和for不是这样测的。
  • 打赏
  • 举报
回复
我只看看,我不回答
加载更多回复(5)

58,454

社区成员

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

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