我在从多维对象数组中填充双向双数组时遇到了一些问题。我的问题是 null 值导致 a java.lang.NullPointerException
at IOControl.ReadCSV$1.compare(ReadCSV.java:328)
at IOControl.ReadCSV$1.compare(ReadCSV.java:1)
at java.util.TimSort.countRunAndMakeAscending(Unknown Source)
at java.util.TimSort.sort(Unknown Source)
at java.util.TimSort.sort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at IOControl.ReadCSV.run(ReadCSV.java:324)
at en.window.Main.main(Main.java:46)
,我真的不明白为什么。
我在做什么 ?
我正在读取一个 CSV 文件,我将输入逐行存储在我的对象数组中,Data
称为content
. 然后我正在填充一个double
名为的二维数组sortedOutput
,我想在其中存储它LeftSpeed
,NormAvgPowOutput
它们是存储在我的Data
数组中的双精度值。
我想要什么:
让我的sortedOutput
双向数组在维度 0 上从最小值到最大值排序:对于变量LeftSpeed
。
那么我怎样才能避免空值呢?因为当我在填充第二个数组时尝试发现它们时,编译器说我无法将双精度值与null
值进行比较。
很抱歉,这篇文章很长,希望你们能帮助我:)这是我的代码:
public void run(String path, int length)
{
/*
* Main function of ReadCSV class.
* Open / reads / closes the file.
* Fills the object.
*/
BufferedReader br = null;
String input = "";
String cvsSplitBy = ",";
int[] pos = new int[200];
Data[] content = new Data[length];
Double[][] sortedOutput = new Double[length][4];
int i = 0;
int j = 0;
int k = 0;
try
{
br = new BufferedReader(new FileReader(path));
while ((input = br.readLine()) != null)
{
// use comma as separator
String[] lines = input.split(cvsSplitBy);
content[i] = new Data();
if (i == 0)
{
//not relevant here
}
else
{
j = 0;
content[i].setTime("TIME", getTime(pos[j++], lines));
content[i].setData("DATA", getContent(pos[j++], lines));
//etc
}
// gets rid of non coherent or useless values, e.g negative power, ...
if (content[i].lhWdStdev > 0 && content[i].rhWdStdev > 0)
{
normalizeData(content[i]); // not relevant
content[k].setLeftSpeed();
sortedOutput[k][0] = content[k].getLeftSpeed();
sortedOutput[k][2] = content[k].getNormAvgPowOutput();
Arrays.sort(sortedOutput, new java.util.Comparator<Double[]>()
{
public int compare(Double[]a, Double[]b)
{
return Double.compare(a[0], b[0]);
}
});
}
if (sortedOutput[k][0] == null)
{
System.out.println("FAIL");
}
System.out.println("Output = " +sortedOutput[k][0]);
i++;
k++;
}
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
// Again it's not relevant
}
编辑:所以最后我犯了两个巨大的错误。首先,我尝试在循环中对数组进行排序,这意味着在它完全填充之前(感谢@Ted Hopp)。其次,我没有null
正确处理这些值。我应该检查 if ( a != null
, b != null
, a[0] != null
, b[0] != null
) 然后返回新订单。(感谢@jboi)。