【问题标题】:Tokens Null Pointer Exception令牌空指针异常
【发布时间】:2013-08-22 14:14:20
【问题描述】:

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

【问题讨论】:

  • 您是否尝试过初始化总计?像字符串总计 = "";您可以使用 StringBuilder 来“构建”字符串。
  • 你说你在myItems[counter].name=myTokens[counter];这一行得到了错误 -> 你的代码中没有这样的行
  • 请使用Java命名约定!类名以大写字母开头。

标签: java nullpointerexception token


【解决方案1】:

你已经初始化了数组

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

但不是它的元素

mySerials[counter].name // will throw NPE

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    请注意,只会填充 mySerials 的所有其他元素...为什么不直接创建一个 List&lt;serial&gt; 并向其中添加项目?

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:
         while (counter < myTokens.length) {
             mySerials[counter] = new serial();
             mySerials[counter].name = myTokens[counter];
             counter++;
             mySerials[counter - 1].onlineISSN = myTokens[counter];
             counter++;
         }
        

        【讨论】:

          【解决方案5】:

          问题出在这条线上:

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

          刚刚顶部,你已经初始化了Searil的数组,但是还没有元素

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-07-12
            相关资源
            最近更新 更多