返回信息流public static int haga(){
int a=3;
while(1<=a){
if(1<a)
a--;
else{
return 1;
}
}
}
为什么这样的函数会认为没有返回值?
这是一条镜像帖。来源:北邮人论坛 / java / #39296同步于 2015/3/16
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
求解:一个函数提示没有返回值
qxyat
2015/3/16镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
为什么不一定执行呢?我觉得a一定会减到1,然后不就执行了吗?
【 在 hellohuhu 的大作中提到: 】
: 因为return 不一定执行,return要写在if else 外,或者在if else 外写个默认的retuurn
【 在 qxyat 的大作中提到: 】
: 为什么不一定执行呢?我觉得a一定会减到1,然后不就执行了吗?
编译器没那么聪明。(编译器要是有这么聪明,就可以解决停机问题了)
我猜测是因为编译器在后面的语句里不对a的初值做假设
认为a可以是任意值,有可能会使这个函数没有返回值
如果改成while(true),编译器是不会报错的。
实际上,考虑这种情况,
假设有A、B两个线程同时执行这个函数,
1.A、B均执行完第4行(if(1<a)),准备进入if函数
2.A线程循环2次后准备执行第3行(while(1<=a))(此时a=1)
3.B线程执行第5行(a--;)(此时a=0)
4.A线程执行第三行,while条件是false,停止循环,函数体执行到最后无返回值
因此,编译器不对a值做假设是有道理的
【 在 qxyat (qxyat) 的大作中提到: 】
: 为什么不一定执行呢?我觉得a一定会减到1,然后不就执行了吗?
【 在 qxyat 的大作中提到: 】
: public static int haga(){
: int a=3;
: while(1<=a){
: ...................
再举个例子
/** 根据歌德巴赫猜想,一个偶数可以分解为两个质数的和。这个函数输入一个偶数,返回其中一个质数。 */
public static int goldbach(int num) {
if (num < 4 || num % 2 == 1) throw new IllegalArgumentException("num must be an even number of at least 4");
for (int i=2; i<num; i++) {
int j = num - i;
if (isPrime(i) && isPrime(j)) { // 假设isPrime可以判断是否为质数。
return i;
}
}
}
Java编译器肯定会报告函数到末尾没有返回值。但是我们也可以主张:“如果歌德巴赫猜想是正确的,那么那个for循环一定会在内部返回。”但是,哥德巴赫猜想到底是不是正确的,连数学家也没有定论。如果Java编译器能够判断这个函数到底有没有编译错误,那这个编译器就太厉害了:它已经证实(或者证伪)了哥德巴赫猜想。
但据我所知编译器没那么聪明。它只能说:for循环总是有可能结束的,你必须在后面加上返回语句。
谢谢提示!
【 在 nuanyangyang 的大作中提到: 】
: 再举个例子
: [code=java]
: /** 根据歌德巴赫猜想,一个偶数可以分解为两个质数的和。这个函数输入一个偶数,返回其中一个质数。 */
: ...................
【 在 qxyat 的大作中提到: 】
: public static int haga(){
: int a=3;
: while(1<=a){
: ...................
编译器并不知道你的a的值。a值在类加载到内存 初始化那一步才知道的吧。