我的主要方法中有一个局部变量ID,如下所示:
ID = new int[9];
ID[0] = 245;
ID[1] = 76644;
//etc
我还有一个objectArrayList,具有以下构造函数:
public Songs( String songName, String artistName, Integer duration, double price) {
this.songName = songName;
this.artistName =artistName;
this.duration = duration;
this.price = price;
我启动了一个二维数组,如下所示:
Songs reco[][];
reco = new Songs [99999] [];
for (int i=0; i<99999; i++) {
reco[i] = new Songs[20];
}
我想做的是使用变量ID作为2d数组的第一个索引,如下所示:
reco[ID[7]][1] = new Songs("Human", "The Killers", 288, 0.19); // ID always is a 5 digit number
为了使我可以使用[ID [x]]作为参考来浏览2d数组,以便添加可能遇到的持续时间的不同值。
假设以下2d数组:
reco[ID[7]][0] = new Songs("Better Now", "Post Malone", 239, 0.25);
reco[ID[7]][1] = new Songs("Human", "The Killers", 288, 0.19);
reco[ID[0]][2] = new Songs("Smells like teen spirit", "Nirvana", 214, 0.28);
预期结果应为:
"Customer:" [ID[7] total song duration is 239+288
"Customer:" [ID[0]] total song duration is 214
问题是,无论我设法制造什么循环,最终我都会遇到空指针错误,因为我正在将[ID [x]] [v]与[ID [x] [v + 1]比较, ()方法,最终达到空值。
希望我的问题很清楚。
最好的
(我知道人们可以使用哈希函数使数字迭代的重要性降低,尽管这不是我现在想解决的问题)
答案 0 :(得分:0)
空指针异常是由默认情况下访问填充有空元素的数组引起的。您正在使用类似
的元素reco [ID [7]] [1] = ...
不检查ID数组中的索引7是元素还是null。
如果您要创建一个像新的Songs[99999]
这样的非常长的数组,则应使用一个List和Iterators,以便该真正长数组的内存中没有保留空间。
“ 99999首歌曲”
Songs reco[][]; reco = new Songs [99999] []; for (int i=0; i<99999; i++) { reco[i] = new Songs[20]; }
创建ArrayList或List并用诸如以下歌曲列表填充它要容易得多:
List<List<Songs>> songs = new ArrayList<ArrayList<Songs>>();
然后您可以遍历整个列表,例如:
for(List<Songs> tempSongsArray : songs)
{
for(Songs tempSong : tempSongsArray)
{
//Code using tempSong as Songs Element
}
}
由于列表的长度<==>列表中的元素的长度,因此使用列表应该是空指针安全的