Java 临时哈希表上的NullPointerException
我有一个项目,其中我必须允许用户将员工输入哈希表,但是我们不能使用预定义的哈希表。我最终使用了一个ArrayList数组,构造函数给了它一个值,这样它就不会得到nullpointerexception。。。然后它在使用哈希表的第一行得到了一个。我注释掉了那个片段,因为它不是绝对必要的,然后在下一个hash实例中出现了相同的问题。 类和构造函数:Java 临时哈希表上的NullPointerException,java,nullpointerexception,Java,Nullpointerexception,我有一个项目,其中我必须允许用户将员工输入哈希表,但是我们不能使用预定义的哈希表。我最终使用了一个ArrayList数组,构造函数给了它一个值,这样它就不会得到nullpointerexception。。。然后它在使用哈希表的第一行得到了一个。我注释掉了那个片段,因为它不是绝对必要的,然后在下一个hash实例中出现了相同的问题。 类和构造函数: public class Hash { private ArrayList<Employee>[] hash = (ArrayList&
public class Hash {
private ArrayList<Employee>[] hash = (ArrayList<Employee>[])new ArrayList[5];
//
public Hash()
{
ArrayList<Employee>[] q = (ArrayList<Employee>[])new ArrayList[5];
hash=q;
}
公共类哈希{
私有ArrayList[]哈希=(ArrayList[])新ArrayList[5];
//
公共哈希()
{
ArrayList[]q=(ArrayList[])新的ArrayList[5];
hash=q;
}
以及故障代码:
do
{
p = (int) (Math.random( )*999999) + 1 ;
for (int w = 0; w<5; w++)
{
boolean t = hash[w].isEmpty(); // The line where I get the NPE Error
if (t=false)
{
for (int r = 0 ; r<hash[w].size(); r++) //where it shows up if I comment out the above.
{
o=o||p==(hash[r].get(w).geteN());
}
}
}
}
while (o = true);
do
{
p=(int)(Math.random()*99999)+1;
对于(int w=0;w请记住,在Java中声明对象的数组时,必须将数组的每个元素都设置为某个值。否则,您只有一个空数组
请在构造函数中尝试以下操作:
for (int i=0; i<hash.length; i++)
hash[i] = new ArrayList<Employee>();
for(int i=0;i您没有完成数组的初始化
public Hash() {
ArrayList<Employee>[] q = (ArrayList<Employee>[])new ArrayList[5];
for (int i = 0 ; i != q.length ; i++) {
q[i] = new ArrayList<Employee>();
}
hash=q;
}
public Hash(){
ArrayList[]q=(ArrayList[])新的ArrayList[5];
for(int i=0;i!=q.length;i++){
q[i]=新的ArrayList();
}
hash=q;
}
声明点的初始值设定项也无效,您可以删除赋值,因为您正在构造函数中初始化数组。您已经创建了一个数组来保存5ArrayList
,但是您还没有创建这5个ArrayList
中的每一个来放入数组
因此,数组中不存在对ArrayList
对象的引用,而是将数组中的每个元素设置为null
的初始值。因此,当您尝试使用这些不存在的ArrayList
时,将引发NullPointerException
创建数组后,按如下方式创建每个ArrayList
:
for (int i = 0; i < hash.length; i++)
hash[i] = newArrayList<Employee>();
for(int i=0;i
您的代码非常奇怪且随机,其他代码也会帮助您查看是否初始化过它(这可能是您的问题),但以下是我对代码的最佳解释
do {
p = (int) (Math.random( )*999999) + 1 ;
for (int w = 0; w<5; w++) {
if ( hash[w] != null){
boolean t = hash[w].isEmpty(); // The line where I get the NPE Error
if (t == false){
for (int r = 0; r<hash[w].size(); r++) {
o=o||p==(hash[r].get(w).geteN());
}
}
}
}
}
do{
p=(int)(Math.random()*99999)+1;
对于(int w=0;w
…但是我们不能使用预定义的哈希表
我认为这是您真正的错误。除非您有一些极端的性能或内存使用限制,否则最好使用哈希表的标准Java实现(或来自Apache Commons、Google Guava等的第三方实现)。它们可以工作(前提是你不做傻事……比如使用可变键)。它们在典型用例中表现良好。每个人都理解它们
实现您自己的哈希表几乎肯定是一个糟糕的选择,尤其是因为创建一个在各个方面都不能很好扩展的实现很容易。在我看来,您最好的选择是在您的自制哈希表代码被过度烘焙到您的应用程序中之前将其丢弃
在评论你的实际代码时,我不明白如果你在进程中插入随机数,哈希表怎么可能工作。你的代码从算法角度看是不可理解的……对我来说毫无意义
如果您告诉我们为什么您认为不能使用其中一个标准实现,我们可能会给您更好的建议。您的ArrayList数组不包含任何内容这行是什么意思?它应该在If语句中吗?o=o | | p==(hash[r].get(w).geteN();此外,通过查看您的代码,很明显您不喜欢编程经验,因为您有带有single=I的if语句。我将在第二个示例中发布正确的版本。首先,我认为您的意思是“if(t==false)”而不是“if(t=false)”,我说得对吗?@blazingkin:只要o
是一个boolean
和hash[r].get(w).geteN()
返回一个int。将它读作“o
等于o
或与(isp
等于hash[r].get(w).geteN()
)”。您还可以添加,q
是一个不必要的临时变量,可以用实例变量hash
@AusCBloke替换。这是一个很好的观点。我试图尽可能接近原始变量,以便OP更容易识别发生了什么变化。这就成功了。我实际上有一页NullPointerExceptions,但我认为它们都是由于在许多地方发生的相同问题造成的……我猜不是。不管怎样,希望我能够处理其余的问题(也许可以向我的老师询问NetBeans自动生成代码中的错误),谢谢。