2013-12-10 56 views
0

我有這種格式與50個州和首都文件:無法從文件的子分配給我的數組

阿拉巴馬州,塔拉赫西,

威斯康星大學麥迪遜分校,

.... ....

我想分配狀態和首都到單獨的數組,我有for循環的問題。我的代碼如下:

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.util.Scanner; 
public class StatesAndCapitals { 

public static void main(String[] args) throws FileNotFoundException { 
    FileInputStream is = new FileInputStream("capitals.txt"); 
    Scanner input = new Scanner(is); 
    String[] states = new String[50]; 
    String[] capitals = new String[50]; 
    for (int i = 0; i < states.length; i++){ 
     int a = states[i].lastIndexOf(","); 
     String states1 = states[i].substring(0, a); 
     states[i] = states1; 
     input.nextLine(); 
    }//end for loop 

    System.out.println(states); 

} 

}

我得到的錯誤是

Exception in thread "main" java.lang.NullPointerException 
    at StatesAndCapitals.main(StatesAndCapitals.java:12) 

任何幫助,將不勝感激。

回答

0

當你

states[i].lastIndexOf(","); 

您要分析的states[i]內容。但那是你的目標數組,而不是包含文本的源。源是從input.nextLine()返回的內容,這應該是您在每次迭代中應該做的第一件事:

for (int i = 0; i < states.length; i++){ 
    String currentLine = input.nextLine(); 
    // now extract the data from current line, and store them in the arrays. 
} 
0

對象的默認值是null

String[] states = new String[50]; //<-- you declare an array that can holds 50 Strings but they're actually null if you don't initialize them. 

所以在做states[i].lastIndexOf(",");時會拋出一個NPE。

您的capitals陣列的行爲相同。

閱讀Default Values部分。


您需要將DATAS首先存儲在 String變量:

for (int i = 0; i < states.length; i++){ 
     String data = input.nextLine(); 
     // Now process with data and add corresponding parts to states and capitals array 
    }//end for loop 

,然後再處理這個String並將其添加到相應的數組。

不是說如果你的文件中沒有足夠的行(小於50),它會拋出java.util.NoSuchElementException,因爲沒有更多的行被發現。

可以將此條件添加到循環:for (int i = 0; i < states.length && input.hasNextLine(); i++){

當你將得到這個工作正常,我建議你去對付List

0
for (int i = 0; i < states.length; i++){ 
    int a = states[i].lastIndexOf(","); 
    String states1 = states[i].substring(0, a); 
    states[i] = states1; 
    input.nextLine(); 
}//end for loop 

這整個循環是倒退的。當您第一次輸入i = 0時,您嘗試獲取states數組的子串,該數組從未見過任何分配。然後,您在結尾input.nextLine();之前的循環內處理該子字符串,這是永遠不會實際使用的。

如果使用正確,input變量實際上會保存您打開的文件中的數據,並允許您使用substring來操作字符串。你需要重新排序並修復你的循環。

相關問題