2011-04-11 87 views
2

,当我试图运行此代码我得到这个error..I不知道我错在哪里..异常线程“main” java.lang.ArrayIndexOutOfBoundsException:0误差在Java中

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 
    at numericalComputatio.fibo.main(fibo.java:30) 


package numericalComputatio; 

public class fibo {  

    static double c = -0.618; 
    // double c = [(1-sqrt(5))/2] = - 0.618 

    /** 
    * Computes the fibonacci series 
    * @param n 
    * @return 
    */ 
    private static double fibo(int n){ 

     if (n == 0) 
      return 1; 
     else if (n == 1) 
      return c; 
     else 
     { 
      double result = fibo(n - 1) + fibo(n - 2); 
      return result; 
     } 
    } 

    public static void main(String[] args) { 
     int n = 0; 
     double result = 0.0; 
     double result1 = 1.000000000; 
     if (args[0] != null) 
      n = Integer.parseInt(args[0]); 

     for(int i = 0; i<=n; i++) 
     { 
      result = fibo(i); 
      System.out.println("fib(" + i + ") = " + result + "Formula value = " + result1); 
      result1 = result1*c; 
     } 
    } 
} 

回答

6

这里:

args[0] 

线30

if (args[0] != null) 

你必须传递一个参数。

args[0]尝试访问args数组中的第一个元素,因为它是从命令行参数中填充的。如果您未传递任何数组为空的参数,并尝试访问数组中不存在的元素,则会发出该异常。

你必须学会​​阅读异常堆栈跟踪。起初他们看起来毫无意义,但一旦你知道如何阅读它们,它们是非常有帮助的。这里是你的:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 
at numericalComputatio.fibo.main(fibo.java:30) 

它读起来就像这样:

  • 你有“主”线程的异常,这意味着它直接来自于由public static void main方法
  • 异常开始流是:java.lang.ArrayIndexOutOfBoundsException: 0这意味着存在一个数组,并且该索引试图将访问权限设置为0(第一个元素),从而为您提供有关正在发生的事情的良好线索。
  • 最后打印出Java文件的名称和行号:fibo.java:30当您手边有源文件并且可以直接查看该行号时,这也特别有用。

我希望这有助于。

+1

它不会走到这一步,因为它会在测试'ARGS [0]!= null'死亡。 – 2011-04-11 16:25:09

+0

由于格式化,我错过了异常堆栈跟踪。在看到有罪行之后更正为否。 30 – OscarRyz 2011-04-11 16:28:59

+0

我没有去stacktrace,只知道它正在评估上一行的args [0] :) – 2011-04-11 16:31:17

1

args[0]永远不会为空(在命令行调用时) - 但args.length可以为0,在这种情况下评估args[0]会给你例外,因为有数组中没有元素0。只是测试为:

if (args.length != 0) 
{ 
    n = Integer.parseInt(args[0]) 
} 

顺便说一句,它是相当奇返回一个doublefibo - 正常斐波纳契数列中的整数(0,1,1,2,3,5,8来定义等等)。如果你想缩放它,我会在之后将它乘以你的常量。

0

当你运行它时你提供了一个命令行参数吗?

if (args[0] != null) 
    n = Integer.parseInt(args[0]); 

如果您不是那么上述行将失败。在访问args[0]之前,您应该检查args.length> = 1。

0
args[0] != null 

args不持有任何元素,所以试图访问第0会给你这个

3

要检查你应该使用ARGS args.length - 不引用索引明确

0

此异常是指:

Exception in thread "main" // in main method 
java.lang.ArrayIndexOutOfBoundsException: 0 at // Exception ArrayIndexOutOfBounds 

抛出,表明一阵列具有 被非法索引访问。 该索引为负数或者 大于或等于 数组的大小。

numericalComputatio.fibo.main(fibo.java:30) // in line 30, in class fibo 
0
public class NewMain { 

    public static void main(String[] args) { 

     int argslen=args.length; 
     int argsValue[] = new int[argslen]; 
     for (String i:args) { 
      int d = 0; 
      argsValue[d]=Integer.parseInt(i); 
      System.out.print(argsValue[d]+"\t"); 

     } 

    } 
} 
0

包coordCart;

public class LignePol {0} {0}私人Point [] sommets;

public LignePol(int n) { 
    Point[] sommets = new Point[n]; 
} 
public LignePol(Point[] sommets) { 
    this.sommets = sommets; 
} 

public Point getSommet(int i) { 
    return sommets[i]; 
} 
public void setSommet(int i, Point p) { 
    sommets[i] = p; 
} 

public String toString() { 
    if (sommets.length == 0) 
     return "[ ]"; 

    String res = "[ " + sommets[0]; 
    for (int i = 1; i < sommets.length; i++) 
     res += ", " + sommets[i]; 
    return res + " ]"; 
} 

public Object clone() { 
    Point[] bis = new Point[sommets.length]; 
    for (int i = 0; i < sommets.length; i++) { 
     Point p = sommets[i]; 
     bis[i] = new Point(p.x(), p.y()); 
    } 
    return new LignePol(bis); 
} 

public void homothetie(double k) { 
    for (int i = 0; i < sommets.length; i++) 
     sommets[i].homothetie(k); 
} 
public void translation(double dx, double dy) { 
    for (int i = 0; i < sommets.length; i++) 
     sommets[i].translation(dx, dy); 
} 
public void rotation(double a) {  
    for (int i = 0; i < sommets.length; i++) 
     sommets[i].rotation(a); 
} 

void tracer() { 
    for (int i = 1; i < sommets.length; i++) 
     tracerSegment((int) sommets[i - 1].x(), (int) sommets[i - 1].y(), 
       (int) sommets[i].x(), (int) sommets[i].y()); 
} 

public static void main(String[] args) { 
    Point[] t = { 
      new Point(1, 3), new Point(0, 2), new Point(0, 0), 
      new Point(3, 5), new Point(4, 4), new Point(0, 4), 
      new Point(4, 2), new Point(4, 0), new Point(1, 1) }; 
    LignePol lp = new LignePol(t); 

    double m = Double.parseDouble(args[0]); 
    double n = Double.parseDouble(args[1]); 
    double l = Double.parseDouble(args[1]); 

    lp.homothetie(l/4.0); 
    lp.translation(m, n); 

    lp.tracer(); 
} 

// pour la simulation 
static void tracerSegment(int x0, int y0, int x1, int y1) { 
    System.out.println("(" + x0 + "," + y0 + ") --> (" + x1 + "," + y1 + ")"); 
} 

}

+0

你能解释一下/为什么你的代码工作吗?这将使OP和其他人了解和应用你的方法(如适用)在其他地方。仅限代码答案[不鼓励]( http://meta.stackexchange.com/q/148272/284827)并可能被删除。 - [在审查期间](http://stackoverflow.com/review/late-answers/11922927) – 2016-04-07 02:24:21

相关问题