0

我对 Java 和编程非常陌生,并且正在从事一个类项目,我们正在学习 i/o、数组和对象,并且我们有一些非常具体的指导方针要遵循。当编译器到达“countryInfo[count].setName(name);”时 ,它给了我

Main.main(Main.java:53) 处的线程“main”java.lang.NullPointerException 中的异常

如果我将其注释掉,下一行会给我同样的错误。我确信有更有效的方法来重新编写这段代码,但由于我们是新手,我们不允许这样做。在我问之前,我读了很多关于 Null 异常的内容……如果我在某个地方错过了它,我深表歉意。我迷路了 :(

public class Main {

/**
 * @param args the command line arguments
 */
private static Country[] countryInfo = new Country[43];

public static void main(String[] args) throws IOException {
    String name = "";
    String capital = "";
    String region = "";
    int region_Nbr = 0;
    int capital_population = 0;

    // TODO code application logic here
    String filename = "Countries.txt";
    String inputString;

    FileInputStream fis1 = new FileInputStream(filename);
    BufferedReader br1 = new BufferedReader(new InputStreamReader(fis1));
    inputString = br1.readLine();

    while (inputString != null) {
        int count = 0;
        System.out.print(inputString + "\n");

        name = inputString.substring(0, 13).trim();
        //System.out.print(name + ", "); //echo

        capital = inputString.substring(24, 36).trim();
        //System.out.print(capital + ", ");//echo

        region = inputString.substring(40, 56).trim();
        //System.out.print(region + ", "); //echo

        region_Nbr = Integer.parseInt(inputString.substring(64, 66).trim());
        //System.out.print(region_Nbr + ", ");//echo

        capital_population = Integer.parseInt(inputString.substring(72, inputString.length()).trim());
        //System.out.print(capital_population + "\n");

        countryInfo[count].setName(name);
        countryInfo[count].setCapital(capital);
        countryInfo[count].setRegion(region);
        countryInfo[count].setRegionNum(region_Nbr);
        countryInfo[count].setPopulation(capital_population);
        inputString = br1.readLine();

        count++;
    } //end while

}

}

public class Country {

private String name;
private String capital;
private String region;
private int region_Nbr;
private int capital_population;



public void setName(String w) {
    this.name = w;

} //end get name
4

2 回答 2

3

你永远不会用对象填充你的数组。目前你有一个数组,但它是空的并且只填充了空值。解决方案是在使用前创建对象以填充它。将数组想象成类似于蛋箱。你不能用板条箱里的鸡蛋做饭,除非你先把鸡蛋装满。

    countryInfo[count] = new Country(); // **** add
    countryInfo[count].setName(name);
    countryInfo[count].setCapital(capital);
    countryInfo[count].setRegion(region);
    countryInfo[count].setRegionNum(region_Nbr);
    countryInfo[count].setPopulation(capital_population);
    inputString = br1.readLine();

编辑,你说:

我不确定我是否理解为什么需要添加该行,我认为 private static Country[] countryInfo = new Country[43];

当您创建数组对象(也称为引用类型数组)时,您会创建一个空变量集合,这些变量被赋予任何引用变量的默认值 null。这与创建原始类型数组不同,后者会将数组初始化为原始类型的默认值(0 表示整数,false 表示布尔值等)。

同样,这类似于创建一个空鸡蛋盒或一个停车场。为了使数组充满对象,您必须自己将对象放入数组中。您需要在停车场填满汽车,然后才能选择一辆并开走一辆。只是有一个空位的停车场对你没有用处。

于 2013-05-10T02:02:56.787 回答
0

您应该添加:

countryInfo[count] = new Country();

countryInfo[count].setName(name);
于 2013-05-10T02:10:31.123 回答