令牌空指针异常

时间:2013-08-22 14:14:21

标签: java nullpointerexception token

以下代码打开一个文本文件,并使用逗号作为分隔符将其内容分解为标记。我使用了与此类似的代码并且工作正常但是出于某种原因,这会在“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()

5 个答案:

答案 0 :(得分:5)

您已初始化数组

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

但不是其元素

mySerials[counter].name // will throw NPE

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

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

答案 1 :(得分:1)

您已创建阵列,但未填充它。所以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命名约定。尽可能早地在命名方面养成良好的习惯。

答案 2 :(得分:0)

您需要在Serial中实例化mySerials个对象:

while (counter < myTokens.length) {     
    mySerials[counter] = new Serial();
    // ...

答案 3 :(得分:0)

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

答案 4 :(得分:0)

问题在于:

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

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

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

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