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
我 运行 没耐心了,需要解决这个问题。该程序旨在从两个文本文件中检索数据作为两个字符串数组,然后使用合并排序算法对结果进行排序。我的问题是在转换为整数数组的过程中。我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