令牌Null指针异常



以下代码打开一个文本文件,并使用逗号作为分隔符将其内容分解为标记。我使用过类似的代码,它运行得很好,但由于某种原因,这在"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()

您已经初始化了数组

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

但不是其元件

mySerials[counter].name // will throw NPE

在访问其成员之前,您需要首先初始化元素

mySerials[counter] = new serial(/* something possibly */);

您已经创建了数组,但没有填充它。所以mySerials[counter]为null,但您正在取消对它的引用。我认为您想要类似以下内容:

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

假设你的serial类有一个合适的构造函数。或者更好的是,同时处理两个部分:

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

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

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

您需要在mySerials:中安装Serial对象

while (counter < myTokens.length) {     
    mySerials[counter] = new Serial();
    // ...
 while (counter < myTokens.length) {
     mySerials[counter] = new serial();
     mySerials[counter].name = myTokens[counter];
     counter++;
     mySerials[counter - 1].onlineISSN = myTokens[counter];
     counter++;
 }

问题出在以下行:

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

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

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

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

最新更新