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