1

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

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. 我想,我会导致一些指针错误。

4

2 回答 2

3

在 Java 中,参数作为引用的副本传递。

当你这样做时,

str = new String[ tokens.length]

您丢弃方法调用传递的引用并创建一个新的引用(它只存在到try创建的范围结束时)。originalstateNames一直指向原始值,即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[],因此您不再使用原始代码。

于 2013-04-24T23:01:32.410 回答
1

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

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()
于 2013-04-24T23:02:09.793 回答