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

时间:2015-03-19 14:58:00

标签: java arrays nullpointerexception null

我已经没有耐心了,需要解决这个问题。此程序旨在从两个文本文件中检索数据作为两个字符串数组,然后使用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)
{

}
}

4 个答案:

答案 0 :(得分:2)

您在尝试访问NullPointerException时收到store1因为您从未向store1提供除null以外的值,因为Java为pass-by-value

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

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

替换

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传递给方法已经没有任何意义了。按照他关于清理方法的建议是个好主意。

答案 1 :(得分:2)

正如azurefrog在评论中提到的,Java数组是pass by value (the reference to the array),因此当您在方法中重新分配store变量时,传入的原始数组不会获得新的引用赋值。 / p>

由于你想多次重复使用这个方法来制作不同的数组,我建议每次在方法中创建一个新的数组。无需传递它。

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

}

然后在你的主叫代码中:

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

或在readFiles()中使用this.store1而不是