1

以下代码打开一个文本文件,并使用逗号作为分隔符将其内容分解为标记。我使用了与此类似的代码,它运行良好,但由于某种原因,这会在“myItems[counter].name=myTokens[counter];”上抛出 NullPointerException

public static serial[] getSerials(String fName) throws Exception {
    String total = null;
    BufferedReader lineReader = null;
    lineReader = new BufferedReader(new FileReader(fName));
    while ((lineReader.readLine()) != null) {
        total = total + lineReader.readLine() + ",";
    } //end while
    String[] myTokens = total.split(","); /*break the string csv tokens*/
    /*Put together the serial objects*/
    serial mySerials[] = new serial[myTokens.length];
    int counter = 0;
    while (counter < myTokens.length) {
        mySerials[counter].name = myTokens[counter];
        counter++;
        mySerials[counter - 1].onlineISSN = myTokens[counter];
        counter++;
    }
    return mySerials;
} //end getSerials()
4

5 回答 5

5

你已经初始化了数组

serial mySerials[] = new serial[myTokens.length];

但不是它的元素

mySerials[counter].name // will throw NPE

您需要先初始化元素,然后才能访问它们的成员

mySerials[counter] = new serial(/* something possibly */);
于 2013-08-22T14:16:43.607 回答
1

您已经创建了数组,但没有填充它。null 也是如此mySerials[counter]- 但您正在取消引用它。我想你想要这样的东西:

mySerials[counter] = new serial(myTokens[counter]);

...假设您的serial班级有一个合适的构造函数。或者更好的是,处理这两个部分:

mySerials[counter] = new serial(myTokens[counter], myTokens[counter + 1]);
counter += 2;

请注意,只会mySerials填充的所有其他元素...为什么不直接创建一个List<serial>并添加项目呢?

另请注意,该名称serial违反了类的 Java 命名约定。尽早养成良好的命名习惯是值得的。

于 2013-08-22T14:16:56.280 回答
0

问题出在这条线上:

 mySerials[counter].name = myTokens[counter];

就在最前面,你已经初始化了 Searil 的数组,但是还没有元素

serial mySerials[] = new serial[myTokens.length];

因此,当您在循环内部尝试访问时,默认情况下mySerials[0]将返回您null作为数组采用默认值,在您的情况下它将是null,并且您将执行的任何操作null都会给您一个NPE,为避免这种情况,您必须在里面有值你array在创建/初始化的时候或者就在你尝试使用的时候。

于 2013-08-22T14:59:51.267 回答
0

您需要实例化以下Serial对象mySerials

while (counter < myTokens.length) {     
    mySerials[counter] = new Serial();
    // ...
于 2013-08-22T14:17:56.903 回答
0
 while (counter < myTokens.length) {
     mySerials[counter] = new serial();
     mySerials[counter].name = myTokens[counter];
     counter++;
     mySerials[counter - 1].onlineISSN = myTokens[counter];
     counter++;
 }
于 2013-08-22T14:19:56.693 回答