2013-07-22 130 views
2

期間分配空我在java.Now我正在pratice.Actually過程中面臨的問題,我想從一個StringTokenizer類得到的字符串令牌和想分配這些令牌字符串數組初學者。但我得到空指針異常。我的代碼在這裏。空指針異常與初始化

public class Token { 
    public static void main(String str[]) 
    { 
     String str1="This is my first page"; 
     StringTokenizer str2=new StringTokenizer(str1); 
     int i=0; 
     String d[]=null; 
     while(str2.hasMoreTokens()) 
     { 
      d[i]=str2.nextToken(); 

     } 
    System.out.println(d); 
    } 
} 
+4

'字符串d [] = NULL;'爲什麼做呢? (然後,當你寫'd [i] .something'就像寫'null.something'這會導致NPE)。 – Maroun

回答

3

數組必須初始化。這個:

String d[] = null; 

本質上創建一個對數組的引用,它是null。因此NullPointerException

更重要的是,即使它被初始化,大小爲固定和陣列不能調整大小。你可以這樣做:

String[] d = new String[]; // won't compile: size not specified 

繼續,你這樣做:

d[i] = "whatever"; 

i總是0

使用List<String>代替:

List<String> list = new ArrayList<>(); 

.add(theString)它:

while (str2.hasMoreTokens()) 
    list.add(str2.nextToken()); 

最後但並非最不重要的,這樣的:

System.out.println(d); 

不會做你認爲它。它將打印該數組引用的字符串表示。如果你想在陣列加上其元素的字符串表示,這樣做:

System.out.println(Arrays.toString(d)); 
1

試圖填充null陣列是不可接受的:

String d[]=null; 

將其更改爲String[] d = new String[20];,但這裏是另外一個問題,你不知道你有多少令牌獲得,所以使用動態列表(例如ArrayList)會更好。在Java中

+0

主席先生,我認爲我們可以將null賦值給一個引用變量,那麼我們可以給它賦值.. –

+0

@TusharPaliwal如果給數組賦值null,那麼在內存中將沒有空間分配給數組。那麼如何將值分配給未分配數組的條目呢?你根本不能。 – Juvanis

+0

不適用於陣列,不能 – fge

0

您定義d[]null,然後訪問元素i。這是造成NullPointerException

你應該做的是初始化d[]大到足以讓所有的標記適合,例如String d[] = new String[100]

哦,不要忘了你的遞增計數器i

而不是使用數組,可以考慮使用List<String>,因爲它會動態地增加,所以你將不必挑選一個初始大小必須足夠大,你的所有數據,以適應在。

1

更好的使用列出你的情況,因爲你不知道標記器返回多少個元素。

public static void main(String str[]) 
{ 
    String str1="This is my first page"; 
    StringTokenizer str2=new StringTokenizer(str1); 
    int i=0; 
    List<String> d=new ArrayList<String>(); 
    while(str2.hasMoreTokens()) 
    { 
     d.add(str2.nextToken()); 

    } 
    System.out.println(d); 
} 
0
+0

雖然此鏈接可能回答此問題,但最好在此處包含答案的重要部分並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 –

+1

@HinataHyuga感謝您的推薦。我會爲我的下列答案做這件事。 – newuser

4

你應該算令牌和初始化使用基於該字符串數組str2.countTokens()

和印刷應該在循環裏做...

public static void main(String str[]) { 
    String str1 = "This is my first page"; 
    StringTokenizer str2 = new StringTokenizer(str1); 
    int i = 0; 
    String d[] = new String[str2.countTokens()]; 
    while (str2.hasMoreTokens()) { 
     d[i] = str2.nextToken(); 
     System.out.println(d[i]); 
    } 
} 
1

使用令牌計數進行數組初始化:

String d[]=new String[str2.countTokens()]; 
1

StringTokenizer是一個遺留類,由於兼容性原因而被保留,儘管它在新代碼中的使用不受歡迎。建議任何尋求此功能的人使用String或java.util.regex包的拆分方法。

下面的示例示出了如何String.split方法可用於將一個字符串分解成它的基本標記:

 String[] result = "this is a test".split("\\s"); 
    for (int x=0; x<result.length; x++) 
     System.out.println(result[x]);