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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

求救大神

QQ截图20160819181414.png (8.65 KB, 下载次数: 80)

输出语句永远执行不到,为什么可以编译通过?

输出语句永远执行不到,为什么可以编译通过?

20 个回复

倒序浏览
因为你经过了一个for循环和一个IF判断,系统无法识别return语句是否会执行到,如果执行不到后面的输出语句便有可能会执行到!
回复 使用道具 举报
很经典,长见识了
回复 使用道具 举报
break是跳出并结束for循环,return是跳出结束main方法,(个人观点)
回复 使用道具 举报
这个代码是没有问题的,你说的永远执行不到的情况,对应的是死循环里没有跳出语句,只要保证有跳出语句,编译就可以通过
回复 使用道具 举报
当i=4的时候return  方法就结束了,换break就可以了吧
回复 使用道具 举报
return完main方法就完了
回复 使用道具 举报
JunC 中级黑马 2016-8-20 00:25:36
8#
我针对你的提问做了一点小的测试!
[Java] 纯文本查看 复制代码
public static void main(String[] args) {
		method();
	}
	private static void method() {
		for (int i = 0; i < 10; i++) {
			if(i == 4)
				return ;
			else
				return ;
		}
		System.out.println("-----");
	}

发现即使是这样程序也是可以编译通过的。
于是我又做了一个测试,
public static void main(String[] args) {
                method();
        }

        private static void method() {
                int i = 4;
                if (i == 4)
                        return;
                else
                        return;

                System.out.println("-----");
        }
此时Eclipse编译的时候报了Unreachable code(不可达代码)的错误。

反过头来,解释你的你那个代码为什么不报错。
因为你的程序有两个地方有判断,第一个判断是for循环里面的判断
第二个判断是if语句,这两个语句在我们看来是都能通过的,
但是编译器在编译的时候是不能检测到,if的判断结果的,只有运行的时候才能判断是true或false
所以在你看来一定不能执行到的输出语句syso编译期间是不会报错的。
除非是一些编译器能发现的明显错误,就像上面的第二段代码一样,
if和else肯定要执行一段,而if和else语句块里面都有一个return
所以编译器就可以肯定知道,执行if或else方法就会return
所以在return后面的syso是执行不到的,
所以syso语句会报不可达代码的错误。
回复 使用道具 举报
i在for循环中无论什么时候都可能等于4,当等于4的时候执行return,其实就是中断程序的执行,也就不能执行下面的输出语句了!
回复 使用道具 举报
小小丶白 发表于 2016-8-19 20:48
因为你经过了一个for循环和一个IF判断,系统无法识别return语句是否会执行到,如果执行不到后面的输出语句便 ...

有道理,编译器判断不了所以就让通过了,没有很明显的错误。
回复 使用道具 举报
cg1693378787 发表于 2016-8-19 22:47
break是跳出并结束for循环,return是跳出结束main方法,(个人观点)

你的观点是对的
回复 使用道具 举报
itcoder 发表于 2016-8-19 23:22
这个代码是没有问题的,你说的永远执行不到的情况,对应的是死循环里没有跳出语句,只要保证有跳出语句,编译就 ...

无限循环后面执行不到只是其中一种情况
回复 使用道具 举报
JoAndroid 发表于 2016-8-19 23:42
当i=4的时候return  方法就结束了,换break就可以了吧

用return也没问题,问题是最后的输出语句执行不到,编译不报错
回复 使用道具 举报
zhangliuxian 发表于 2016-8-19 23:43
return完main方法就完了

是的,所以后面的输出语句是永远执行不到的
回复 使用道具 举报
JunC 发表于 2016-8-20 00:25
我针对你的提问做了一点小的测试![mw_shl_code=java,true]public static void main(String[] args) {
                me ...

多谢这么认真的回答,应该就是编译器的问题,不能检测出来
回复 使用道具 举报
这个编译肯定能通过,因为第一:语法没错;故此可以编译成功
第二:return 是结束main方法的,其用法和continue 和break差不多一样;下面不能写语句,再者,你是在循环中 ,在判断语句里,首先他要判断,判断成功了,他就运行,不成功,他就相当于废话;而编译时,他不运行只是检查语法,编译时他不知道结果,所以其不管运行与否,都不影响其编译,
第三: 再者是运行他都有结果,都是要终止的,只是终止的时间与步骤方法不同,,就比如你定义一个方法,你可以写两个return,乃至三个return,他都可以编译成功,其原因就是

他编译时,只判断语法,不在乎结果,另外他也不在意结果什么时候终止,他只知道,你写return时,这个return的执行是有条件限制的,满足条件时他就会执行,而不满足时,你程序下面的话还是可以运行的,他认为return后的话,只要有可能有机会运行,那么他就编译OK!
回复 使用道具 举报
江楠大盗 发表于 2016-8-20 15:43
用return也没问题,问题是最后的输出语句执行不到,编译不报错

#8正解{:2_35:}
回复 使用道具 举报
灵动 发表于 2016-8-20 22:00
这个编译肯定能通过,因为第一:语法没错;故此可以编译成功
第二:return 是结束main方法的,其用法和continue  ...

因该是这个样子,赞一个
回复 使用道具 举报
分析一下啊 你表达的意思是,没有之行 System.out.println 语句,但是 能编译通过,
而我也有个疑问问你, 一个程序必须得有System.out.println语句才可以编译通过么?  我觉得你基础的程序执行流程 没有搞清楚
回复 使用道具 举报
很常见啊。后面写程序很多都是判断条件成立直接结束改方法。后面的代码就不执行了。你这属于逻辑错误,不属于语法错误,虚拟机只能检测到语法错误。你那句输出就等于是废话,虚拟机看到return前的东西正确就不会报错
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马