august 发表于 2007-9-14 12:12:48

[java]返回问题

public class HelloWorld{
    int biggest(int x,int y,int z){
      
      if(x>y){
            if(x>z)
            return x;
      }
      else if(y>z){
            if(z>x) return y;
            
      }
      else return z;
      
    }
    public static void main(String[] args){
      HelloWorld aaa=new HelloWorld();
      int answer=aaa.biggest(10,20,30);
      System.out.println("最大数="+answer);
    }
}
为什么这样写会显示缺少返回语言呢?

coolpay64 发表于 2007-9-14 18:06:41

超強大的錯誤
請LZ數數大括号的數目,看看main是在那兒

august 发表于 2007-9-15 10:44:39

括号没打少啊? 不是到了RETURN 程序就结束了吗?
不过改成如果X比Y大的时候用一个变量接收,最后再RETURN就可以,为什么呢?

coolpay64 发表于 2007-9-15 12:56:54

括號沒打少但位置錯了,main應該在class以外

shawind 发表于 2007-9-15 13:50:21

不会吧,java中,main方法可以脱离class单独存在么?

Miliardo 发表于 2007-9-15 13:56:42

和那无关,似乎Java的main必须在一个类中。

Java的语法可能比较严吧,必须要有一个不受条件判断限制的return。
应该是为了避免函数万一没有返回值的情况。(编译器不可能去判断你的条件判断是否已经覆盖了所有的可能性)
LZ试试在biggest的最后加一个return 0;

lw 发表于 2007-9-16 00:42:25

正如楼上M所说,找一个条件可以最终查找到无返回的情况,因为两个if 连续判断才得到一个return,势必存在条件没有调用该return,这样的结果是这个if没有完成返回,而不会进入剩下所有的ELSE,估计楼主可能本来希望出错的数据都归入到最后一个ELSE中,却并不是如此——

这样以来WARNING就变成了语意上的检查,确保程序尽可能在编译的时候就发现问题——类似的比如没有初始化等

不过这不是JAVA的特权,C和C++下面你把/W开到3或者4或者X都可以提示返回缺少的——

lw 发表于 2007-9-16 00:45:05

如果觉得上面太琐碎,楼主自己举个例子:
Z > X > Y 即可——

Miliardo 发表于 2007-9-16 09:34:51

……呃,典型的x86体系是吧return值压栈吧。
如果没压,而调用方取了返回值会出错么?
还是编译器会自动补上一个什么东西……?

而C/C++有些编译器没有捕捉的麻烦最终会通过硬件特性反映出来。
但不管怎么说,Java应该是不能允许出现类似野指针、未定义状况这些东西的。

lw 发表于 2007-9-16 12:31:05

RETURN部分没有压栈操作,只是根据栈内的第一个数据进行返回(跳转到XX地址),另外返回值也是进入之前就协定好了(VC通常是EBP的下一个参数+4),那么如果真的没有任何对返回值有操作,那么就是原来进入的时候的返回值,在VC编译器DEBUG情况通常会得到类似于0XCCCCCCCC的错误值可以立即发生问题(除非纯粹看看……),返回结构通常会被转化,本质上就是返回一个VOID了,结构另外方式存放——

[硬件特性] 偶则不懂什么意思?
类似于VB这类会默认把数值设置为0,有时候是不错,但是会培养不初始化的坏习惯,特别是间隔比较长时候修复的时候会很难抓虫子,个人理解以上。。。
页: [1] 2
查看完整版本: [java]返回问题