布尔数组NullPointerException

时间:2014-04-28 18:25:27

标签: java nullpointerexception boolean primes

我正在尝试创建一个程序,它将为T个案例生成两个给定整数(A& B)之间的所有素数。我正在实施Eratosthenes的Prime Sieve。我的代码如下。我已经读过,代码中提到的行的NullPointerException是我没有初始化布尔数组的结果。但是,我以为我在这里做了这个:

Boolean[] N = new Boolean[B+1];

因此,我很困惑为什么会抛出此异常。我知道没有其他可能的原因。我的代码出了什么问题?

我的错误和输入:

1 1 5
Exception in thread "main" java.lang.NullPointerException
    at PrimeNumberFinder.main(PrimeNumberFinder.java:27)

我的代码:

class PrimeNumberFinder {

    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        //read the number of cases of the problem to expect from input
        int T = sc.nextInt();

        //complete for every case
        for(int i = 1; i<=T; i++){
            //read the boundaries to find primes between
            int A = sc.nextInt();
            int B = sc.nextInt();
            //create boolean array to store primes, according with the Sieve
            Boolean[] N = new Boolean[B+1];
            //set all values to true
            for(int j = 2; j<=B; j++){
                N[j]=true;
            }
            //test for primes for all elements of 'N'
            for(int k=2; k*k<=B; k++){
                if(N[k]){
                    for(int l = k; l*k<=B; l++){
                        N[l*k]=false;
                    }
                }
            }
            //for all prime elements of N between the desired boundaries(A,B) print
            for(int m = A; m<=B; m++){
                //this is the line(below) for which the error appears: NullPointerException
                if(N[m]){
                    System.out.println(m);
                }else{
                    continue;
                }
            }
            System.out.println("");
        }
    }
}

2 个答案:

答案 0 :(得分:0)

关于对象数组,请尝试像这样初始化:

Boolean[] N = new Boolean[B+1];
for(int i=0;i<B+1;i++)
   N[i]=new Boolean();

答案 1 :(得分:0)

您已创建了一个Boolean个对象数组,但它们都已初始化为null。您确实将大多数元素显式初始化为true,但仅从索引2开始。

假设这是与NPE的关系:

if(N[m]){

mA开始,根据您提供的输入显示为1。但那从未初始化。数字1既不是素数也不是复合数,所以你应该单独处理这个案例。