我正在尝试创建一个程序,它将为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("");
}
}
}
答案 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]){
m
从A
开始,根据您提供的输入显示为1
。但那从未初始化。数字1
既不是素数也不是复合数,所以你应该单独处理这个案例。