有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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


共 (2) 个答案

  1. # 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()
    
  2. # 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());
        }
      }
    

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