NullPointerException 错误,将 string[] 转换为 int[]

NullPointerException error, converting string[] to int[]

我 运行 没耐心了,需要解决这个问题。该程序旨在从两个文本文件中检索数据作为两个字符串数组,然后使用合并排序算法对结果进行排序。我的问题是在转换为整数数组的过程中。我return我创建的数组,看到有数据存储。但是,当 运行 循环并检查任何索引是否为空时,我发现程序认为它们都为空。

import java.io.IOException;
import java.nio.file.Files;
import java.io.File;
import java.util.Scanner;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.*;
public class MergeInventories
{
    public static File inv1 = new File("H:\Senior Year\CompSci\Projects\storeOneInv.txt");
    public static File inv2 = new File("H:\Senior Year\CompSci\Projects\storeTwoInv.txt");
    //the two text files I'm retrieving data from
    public static String[] store1; //string array in question
    public static String[] store2;

public static void header()
{
    System.out.println("Keenan Schmidt");
    System.out.println("AP Computer Science");
    System.out.println("Merge Inventories");
    System.out.println("...finally...");
}

public static void main() throws FileNotFoundException
{    
    header();
    readFiles(inv1,store1); //converts file to string array
    sort(); //converts string[] to int[]
    //System.out.print(readFiles(inv1,store1));
    //System.out.print(readFiles(inv2,store2);
}

public static String[] readFiles(File file, String[] store)
{

    try {

        Scanner scanner = new Scanner(file);
        int i = 0;
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            System.out.println(line);
        }
        scanner = new Scanner(file);
        while (scanner.hasNextLine())
        {
            String line = scanner.nextLine();
            i++;
        }

        store = new String[i];
        i = 0;
        scanner = new Scanner(file);

        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            store[i] = line;
        }
        scanner.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    return store;
}

public static int[] sort()
{
    int[] items = new int[store1.length];
    for(int i = 0; i < store1.length; i++)
    {
        if(store1[i] != null) //this is the line where the error occurs
        {
            try{
                items[i] = Integer.parseInt(store1[i].replaceAll("[^0-9]"," "));
            } catch (NumberFormatException nfe) {};
        }
    }

    return items;
}

private void mergeSort(String[] arr1, String[] arr2)
{

}

private void merge(int low, int med, int hi)
{

}
}

你可以先用List,因为文件的大小可能是未知的,然后把List转成Array(使用toArray),然后你就会知道你应该初始化int数组的长度和你的代码可以按预期进行。

您在尝试访问 store1 时得到 NullPointerException,因为您从不给 store1 一个 null 以外的值,因为 Java 是 pass-by-value

您创建了一个新数组,但您只将其分配给 store,这是 readFiles() 中的局部变量,并且该分配对 store1 变量没有影响。

您 return 从您的方法中获取了该值,但您忽略了在调用代码中对其进行赋值。

替换

readFiles(inv1,store1); //converts file to string array

store1 = readFiles(inv1,store1); //converts file to string array and saves it in store1

这样创建的数组就赋值给了store1.

正如 dkatzel 指出的那样,这意味着首先将 store1 传递给该方法不再有任何意义。按照他的建议清理方法是个好主意。

正如 azurefrog 在评论中提到的那样,Java 数组是 pass by value (the reference to the array),因此当您在方法中重新分配 store 变量时,您传入的原始数组不会得到新的参考分配。

由于您想多次重复使用此方法来创建不同的数组,我建议每次都在该方法中创建一个新数组。不用传入了。

static String[] readFiles(File file){
    String[] store =null;
    //rest of method this same

}

然后在你的调用代码中:

store1 = readFiles(inv1);
store2 = readFiles(inv2);

要么更改为:store1 = readFiles(inv1,store1);

或在 readFiles() 中改用 this.store1