我在线程“Thread-0”中获得异常java.lang.ArrayIndexOutOfBoundsException:0在Fib.run(fibThread.java:52)

时间:2015-10-03 17:15:17

标签: java arrays multithreading

import java.util.Scanner;
public class fibThread {
@SuppressWarnings("resource")

public static void main(String[] args) {
    // TODO Auto-generated method stub

    Scanner fib = new Scanner(System.in);

    System.out.print("Enter the Length of the Fibonacci Series :");

    int num = fib.nextInt();

    Runnable r = new Fib("Result", num);
    new Thread(r).start();

    try{
        Thread.sleep(10000);
    }

    catch (InterruptedException e) {
         System.out.println("Thread interrupted.");
     }

    int[] result =((Fib) r).getResult();
    System.out.print("The Fibonacci Series is :" + result);

}
}
class Fib implements Runnable{
private int num;
int f0=0, f1=1,fn=0;

int arr[] = new int[num];

public Fib(String string, int num) {
    // TODO Auto-generated constructor stub
    this.num = num;
}

@Override
public void run() {
    for(int i=0; i<num; i++){
        fn = f0 + f1;
        f0 = f1;
        f1 = fn;
        arr[i] = fn;
    }
}

public int[] getResult(){

    return arr;
}
}

给了我一个问题,我写了上面的代码

编写一个生成fibonacci序列的多线程程序。该计划应如下工作: 在命令行中,用户将输入程序要生成的斐波纳契数。然后程序将创建一个单独的线程,该线程将生成斐波那契数字,将序列放在可由线程共享的数据中(数组可能是最方便的数据结构)。当线程完成执行时,父线程将输出子线程生成的序列。

请帮我解决....

1 个答案:

答案 0 :(得分:1)

原因

您收到ArrayIndexOutOfBoundsException因为num在宣布0时被初始化为arr

int num; // <-- 0
int arr[] = new int[num]; // <-- int[0]
public Fib(String string, int num) {
    // TODO Auto-generated constructor stub
    this.num = num;
}

修复它

您可以将数组声明移动到构造函数中,如

int num;
int arr[];
public Fib(String string, int num) {
    this.num = num;
    this.arr = new int[num];
}

您的作业

您需要分享arr。我认为你应该使用static字段,并进行同步。使用Binet's formula生成斐波纳契数列通常更容易。您的任务似乎是创建一个多线程Iterative Memoized version