Java NullPointerException错误,正在将字符串[]转换为int[]

Java NullPointerException错误,正在将字符串[]转换为int[],java,arrays,nullpointerexception,null,Java,Arrays,Nullpointerexception,Null,我已经没有耐心了,需要解决这个问题。该程序旨在从两个文本文件中检索两个字符串数组的数据,然后使用mergesort算法对结果进行排序。我的问题是在转换为整数数组的过程中。我返回我创建的数组,并查看是否存储了数据。但是,当运行循环并检查是否有任何索引为null时,我发现程序认为它们都为null import java.io.IOException; import java.nio.file.Files; import java.io.File; import java.util.Scanner;

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

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)
{

}
}
import java.io.IOException;
导入java.nio.file.Files;
导入java.io.File;
导入java.util.Scanner;
导入java.io.BufferedReader;
导入java.io.FileReader;
导入java.io.*;
公共类合并清单
{
公共静态文件inv1=新文件(“H:\\Senior Year\\CompSci\\Projects\\storeOneInv.txt”);
公共静态文件inv2=新文件(“H:\\Senior Year\\CompSci\\Projects\\storetwinv.txt”);
//我从中检索数据的两个文本文件
公共静态字符串[]store1;//有问题的字符串数组
公共静态字符串[]store2;
公共静态void头()
{
System.out.println(“Keenan Schmidt”);
System.out.println(“AP计算机科学”);
系统输出打印项次(“合并存货”);
System.out.println(“…最终…”);
}
public static void main()引发FileNotFoundException
{    
标题();
readFiles(inv1,store1);//将文件转换为字符串数组
sort();//将字符串[]转换为int[]
//系统输出打印(readFiles(inv1,store1));
//系统输出打印(读取文件(inv2,store2);
}
公共静态字符串[]读取文件(文件文件,字符串[]存储)
{
试一试{
扫描仪=新扫描仪(文件);
int i=0;
while(scanner.hasNextLine()){
字符串行=scanner.nextLine();
系统输出打印项次(行);
}
扫描仪=新扫描仪(文件);
while(scanner.hasNextLine())
{
字符串行=scanner.nextLine();
i++;
}
store=新字符串[i];
i=0;
扫描仪=新扫描仪(文件);
while(scanner.hasNextLine()){
字符串行=scanner.nextLine();
存储[i]=行;
}
scanner.close();
}catch(filenotfounde异常){
e、 printStackTrace();
}
退货店;
}
公共静态int[]排序()
{
int[]items=新int[store1.length];
对于(int i=0;i
您可以先使用列表,因为文件可能大小未知,然后将列表转换为数组(使用toArray),然后您将知道初始化int数组的长度,代码可以按预期进行。

您可以先使用列表,因为文件可能大小未知,然后将列表转换为数组(使用toArray),然后您将知道应该初始化int数组的长度,代码可以按预期进行。

在尝试访问
store1
时,您会得到一个
NullPointerException
,因为您从未给
store1
null
之外的值,因为Java是空的

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

您确实从方法返回了该值,但忽略了在调用代码中分配它

替换

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

以便将创建的数组分配给
store1


正如dkatzel所指出的,这意味着首先将
store1
传递到方法中不再有任何意义。遵循他的建议清理方法将是一个好主意。

当您尝试访问
store1
时,您将得到
NullPointerException
,因为您从未给出
store1ode>不是
null
的值,因为Java是空的

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

您确实从方法返回了该值,但忽略了在调用代码中分配它

替换

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

以便将创建的数组分配给
store1


正如dkatzel所指出的,这意味着首先将
store1
传递到方法中不再有任何意义。遵循他的建议清理方法将是一个好主意。

正如azurefrog在一篇评论中提到的,Java数组是这样的:当您重新分配方法中的
store
变量时,或您传入的原始数组未获得新的引用分配

由于您希望多次重复使用此方法来生成不同的数组,因此我建议每次在该方法中生成一个新数组,无需传入

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

}
然后在您的呼叫代码中:

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

正如azurefrog在一篇评论中提到的,Java数组是这样的:当您在方法中重新分配
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

或者改为:store1=readFiles(inv1,store1)

或者在readFiles()中改用this.store1