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