【发布时间】:2013-09-16 19:45:57
【问题描述】:
我在从多维对象数组中填充双向双数组时遇到了一些问题。
我的问题是 null 值导致 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。
然后我正在填充一个名为sortedOutput 的double 二维数组,我想在其中存储LeftSpeed 和NormAvgPowOutput,它们是存储在我的Data 数组中的双值。
我想要什么:
让我的 sortedOutput bidimensionnal 数组在维度 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
}
编辑:所以最后我犯了 2 个巨大的错误。
首先,我尝试在循环中对数组进行排序,这意味着在它完全填充之前(感谢@Ted Hopp)。
其次,我没有正确处理 null 值。我应该检查一下(a != null,b != null,a[0] != null,b[0] != null)然后返回新订单。 (感谢@jboi)。
【问题讨论】:
-
哪条线在抛出 NPE?
-
如果你想要有用的 cmets,你真的需要发布完整的堆栈跟踪。
-
你自己实现它有什么原因吗?有很好的开源库可以进行 CSV 解析。喜欢opencsv.sourceforge.net
-
问题线是当我开始尝试启动我的数组时:`Arrays.sort(sortedOutput, new java.util.Comparator
()`。这是因为其中一个值显然是 null,但我不知道如何避免这种情况。
标签: java arrays nullpointerexception