[英]Why does this code throw an exception?
import java.util.Scanner;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan=new Scanner(System.in);
int i,j;
int count = 0;
int test=scan.nextInt();
String[] con=new String[test];
while(test>0)
{i=scan.nextInt();
j=scan.nextInt();
for(int k=i;k<=j;k++)
if(prime(k))
//***********the line below where i am getting nullpointer exception
con[count].concat(k+"\n");
test--;count++;}
for( i=0;i<con.length;i++)
System.out.printf("%s\n",con[i]);
}
private static boolean prime(int k) {
// TODO Auto-generated method stub
if(k==2)
return true;
if(k%2==0)
return false;
for(int l=3;l<=Math.sqrt(k);l=l+2)
if(k%l==0)
return false;
return true;
}
}
請有人幫助我如何擺脫這個異常。
String[] con=new String[test];
使用test
元素創建一個新的String
數組,並將其分配給con
。 但是,這根本不會創建任何String
對象- 您只是創建了一個數組,其中所有元素都是null
。 在調用concat()
之前,您必須確保con[count]
實際上是指一個String
; 您可以通過檢查它是否是null
並在調用concat()
之前為其分配""
來執行此操作,或者您可以有一個單獨的循環,將一個空字符串放入con
的每個元素中。
順便說一句: concat()
不會修改您調用它的String
; 它創建一個新的String
並返回它,但你不對返回值做任何事情,所以它被扔掉了。 您應該使用+=
代替(這也會創建一個新的String
,但它會將新的String
分配給數組元素)。
既然你在這里得到 NullPointerException,
con[count].concat(k+"\n");
這意味着con[count]
的值為null
並且您正在嘗試在 null 實例上調用.concat( )
。
這里con[]
沒有初始化,所以默認取null
。 您需要初始化con[]
數組的元素,即說""
,然后嘗試調用 concat 方法。
您沒有初始化 con[] 的每個元素
new String[] 為您提供了一個 null 字符串引用數組。 如果您希望代碼正常工作,您必須將它們設置為空字符串。
當你這樣做
String[] con=new String[test];
您創建一個長度為test
的新字符串數組。 然而,這個數組中的元素開始是null
。 因此,在將它們初始化為字符串之前,您不能對它們調用concat
。
這意味着,您應該在調用concat
之前將字符串初始化為空字符串""
。
另外,字符串是不可變的,所以concat
生成一個新的String,而不是修改已有的,所以需要保存結果。
這意味着,你們都想要這樣的東西:
while(test>0) {
i=scan.nextInt();
j=scan.nextInt();
con[count] = ""; // Initialize con[count]
for(int k=i;k<=j;k++) {
if(prime(k)) {
con[count] = con[count].concat(k+"\n");
}
}
test--;
count++;
}
看起來 conc[count] 是 null,如果那是你得到 NullPointerException 的地方。 你應該用一個值來初始化它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.