Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用户定义的文件读取函数导致NullPointerException Java_Java_Arrays_String_File Io - Fatal编程技术网

用户定义的文件读取函数导致NullPointerException Java

用户定义的文件读取函数导致NullPointerException Java,java,arrays,string,file-io,Java,Arrays,String,File Io,我必须从文本文件读取一些信息到不同的字符串数组。所以,我为这个任务写了一个方法。代码如下: private String[] stateNames; . . . readHelper(stateNames); . . . private void readHelper( String[] str ) // str is stateNames { try { strLine = bufferReader.readLine();

我必须从文本文件读取一些信息到不同的字符串数组。所以,我为这个任务写了一个方法。代码如下:

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());
    }
  }
公共类MyClass{
private List originalList1=new ArrayList();
private List originalList2=new ArrayList();
公开募捐{
本试验(原始试验1、原始试验2);
}
公共无效测试(列表1、列表2){
list1=新的ArrayList();
列表1.add(新字符串(“Hello”);
列表2.add(新字符串(“世界”));
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());
}
}

由于将新对象指定给列表1,原始引用将丢失,因此原始对象不会受到影响(但对于列表2,您仍在使用原始对象)。由于在代码中创建了一个新的
字符串[]
,因此不再使用原始字符串。

在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());
    }
  }
公共类MyClass{
private List originalList1=new ArrayList();
private List originalList2=new ArrayList();
公开募捐{
本试验(原始试验1、原始试验2);
}
公共无效测试(列表1、列表2){
list1=新的ArrayList();
列表1.add(新字符串(“Hello”);
列表2.add(新字符串(“世界”));
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());
}
}

由于将新对象指定给列表1,原始引用将丢失,因此原始对象不会受到影响(但对于列表2,您仍在使用原始对象)。由于在代码中创建了一个新的
字符串[]
,因此不再使用原始字符串。

应将数组作为方法的返回值返回

private String[] readHelper()
    {
        String[] str = null;
        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);
        }
        return str;
    } // End of readHelper()

您应该将数组作为方法的返回值返回

private String[] readHelper()
    {
        String[] str = null;
        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);
        }
        return str;
    } // End of readHelper()
返回“str”不会导致将来的“nullptrexception”,对吗?返回“str”不会导致将来的“nullptrexception”,对吗?