我必须从文本文件中读取一些信息到不同的字符串数组。所以,我为这个任务写了一个方法。这是代码:
private String[] stateNames;
.
.
.
readHelper(stateNames);
.
.
.
private void readHelper( String[] str ) // str is stateNames
{
try
{
strLine = bufferReader.readLine();
String[] tokens = strLine.split(",");
str = new String[ tokens.length ];
copyStr2Str(tokens, str);
insertionSort( str ); // Everything is fine, str contains the data
}
catch (IOException ex)
{
Logger.getLogger(Generator.class.getName()).log(Level.SEVERE, null, ex);
}
} // End of readHelper()
但是在 readHelper()
执行后,stateNames 变为 null
。我想,我导致了一些指针错误。
最佳答案
在 Java 中,参数作为引用的副本传递。
当你这样做的时候,
str = new String[ tokens.length]
您丢弃方法调用传递的引用并创建一个新的引用(它只存在于创建的 try
作用域的末尾)。原始 stateNames
一直指向原始值,即 null
。
修改返回str
数组的方法,赋值给stateNames
。
更新以回答评论:
要了解这一点,请尝试这段代码。
public class MyClass {
private List<String> originalList1 = new ArrayList<String>();
private List<String> originalList2 = new ArrayList<String>();
public void run() {
this.test(originalList1, originalList2);
}
public void test(List<String> list1, List<String> list2) {
list1 = new ArrayList<String>();
list1.add(new String("Hello"));
list2.add(new String("World"));
System.out.println("list1.size -> " + list1.size());
System.out.println("originalList1.size -> " + originalList1.size());
System.out.println("list2.size -> " + list2.size());
System.out.println("originalList2.size -> " + originalList2.size());
}
}
因为你给 list1 分配了一个新的对象,原来的引用丢失了所以原来的对象不受影响(但是对于 list2,你仍然在使用原来的对象)。由于在您的代码中创建了一个新的 String[]
,因此您不再使用原始代码。
关于java - 用户自定义文件读取函数导致NullPointerException Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16203627/