黑马程序员技术交流社区

标题: 关于java的递归问题 [打印本页]

作者: 文密    时间: 2012-4-19 20:27
标题: 关于java的递归问题
public class Factorial {
    static long fac(int n){
        if(n==1)
            return 1;
        else
            return n*fac(n-1);
    }
    public static void main(String[] args){
        int k;
        long f;
        k=Integer.parseInt(args[0]);
        f=fac(k);
        System.out.println(f);
}
}
错误提示:Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
        at javaapplication1.Factorial.main(Factorial.java:21)
Java Result: 1


请问我这个代码有错吗?我是照着书上写上去的!不知道什么原因他就是出错,好像是接收不了数据的输入!
作者: 贠(yun)靖    时间: 2012-4-19 20:43
你运行的时候要传参数,不传参数args【0】肯定不存在 会空指针异常的
作者: liuyang    时间: 2012-4-19 20:44
你的代码没错,只是没有理解main方里数组参数的意义:
String[] args这个数组的值是在你运行时给它:在Dos下输入java Factorial +参数(你要输入的参数)
那么这个时候args.length就是你输入的长度;
像上面那种情况String[] args长度是0所以数组下标就越界了
作者: 崔仁军    时间: 2012-4-20 10:45
在运行时 ,如果是在dos命令行下运行要在命令行传入一个参数 。
作者: 韩新凯    时间: 2012-4-20 10:56
在主函数里面的String[] args 相当于String[] args = null;
args数组里面上面都没有,你让它输出args[0]当然要出错了。
在主函数里面添加args = new String[]{"11","22","1"};就可以了。
作者: 党传才    时间: 2012-4-20 12:18
肯定没用编译器吧,这种错误会自动提示你添加的
作者: 张超超    时间: 2012-4-20 18:41
参数args的主要作用是为程序使用者在命令行状态下与程序交互提供了一种手段。此外在其他类中直接使用main()函数,并传递参数也是可行的,虽然这种方法不太常用,但毕竟为我们提供了一种选择。
args[] 在命令行运行时候输入的参数,因为参数可以为多个,所以要用数组来存,比如dos的copy命令:
  copy c:\*.* d:\*.*

  这就是两个参数c:\*.*和d:\*.*

  java在命令行运行的时候要用到java命令:
  java Test value1 value2

  后面就是两个参数,在main里面args[]就是两个长度的数组value1存在args[1]中,value2存在args[2]中。
  args[0]存储的是命令,其后才是参数!

  在Java中有这样一条语句:public static void main(String[] args)。其中的args是Java命令行参数,我们在DOS中执行Java程序的时候使用“java 文件名 args参数”。args这个数组可以接收到这些参数。

作者: 徐鑫    时间: 2012-4-21 02:26
你这里报了指针越界异常,也就是你那args[0]出错了,你传入的参数为null,是没有args[0]这个值的。如果你是eclipse可以在运行时选run as--->run configurations
在窗口arguments里填几个数作为传入参数就好了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2