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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 文密 中级黑马   /  2012-4-19 20:27  /  3174 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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


请问我这个代码有错吗?我是照着书上写上去的!不知道什么原因他就是出错,好像是接收不了数据的输入!

8 个回复

倒序浏览
你运行的时候要传参数,不传参数args【0】肯定不存在 会空指针异常的

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
你的代码没错,只是没有理解main方里数组参数的意义:
String[] args这个数组的值是在你运行时给它:在Dos下输入java Factorial +参数(你要输入的参数)
那么这个时候args.length就是你输入的长度;
像上面那种情况String[] args长度是0所以数组下标就越界了

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
在运行时 ,如果是在dos命令行下运行要在命令行传入一个参数 。
回复 使用道具 举报
在主函数里面的String[] args 相当于String[] args = null;
args数组里面上面都没有,你让它输出args[0]当然要出错了。
在主函数里面添加args = new String[]{"11","22","1"};就可以了。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
肯定没用编译器吧,这种错误会自动提示你添加的
回复 使用道具 举报
张超超 黑马帝 2012-4-20 18:41:12
7#
参数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:57
8#
你这里报了指针越界异常,也就是你那args[0]出错了,你传入的参数为null,是没有args[0]这个值的。如果你是eclipse可以在运行时选run as--->run configurations
在窗口arguments里填几个数作为传入参数就好了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马