NullPointerException для временного хеш-таблицы - PullRequest
2 голосов
/ 08 декабря 2011

У меня есть проект, в котором мне нужно было разрешить пользователю вводить сотрудников в хеш-таблицу, однако мы не могли использовать предопределенную хеш-таблицу.Я закончил с массивом массивов, и конструктор дал ему значение, чтобы он не получал нулевое исключение ... а потом он получил его в любом случае, в первой строке, которая использовала хеш-таблицу.Я закомментировал этот фрагмент, потому что он не был абсолютно необходим, и затем та же проблема возникла в следующем случае хэша.Класс и конструктор:

public class Hash {
  private ArrayList<Employee>[] hash = (ArrayList<Employee>[])new ArrayList[5];

//
public Hash()
{
    ArrayList<Employee>[] q = (ArrayList<Employee>[])new 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);

Я действительно не уверен, как справиться с этим ... Заранее спасибо.

Ответы [ 5 ]

3 голосов
/ 08 декабря 2011

Помните, что когда вы объявляете Array из Objects в Java, вы должны установить для каждого элемента Array что-то.В противном случае у вас просто есть массив nulls.

Попробуйте вместо этого в своем конструкторе:

for (int i=0; i<hash.length; i++)
    hash[i] = new ArrayList<Employee>();

Исключение составляют случаи, когда вы объявляете Array примитивов (например, int, double и т. Д.), И вместо этого вы получите нули.

1 голос
/ 08 декабря 2011

Вы не закончили инициализацию массива.

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; 
}

Инициализатор в точке объявления также не действует, вы можете удалить присвоение, так как вы все равно инициализируете массив в конструкторе.

0 голосов
/ 08 декабря 2011

... однако мы не могли использовать предопределенную хеш-таблицу.

Я думаю, что это ваша реальная ошибка. Если у вас нет экстремальных ограничений производительности или использования памяти, вам лучше использовать одну из стандартных реализаций Java хеш-таблиц (или стороннюю реализацию от Apache Commons, Google Guava и т. Д.). Они работают (при условии, что вы не делаете глупостей ... например, с помощью изменяемых ключей). Они хорошо работают в типичных случаях использования. Все их понимают.

Реализация ваших собственных хеш-таблиц почти наверняка является плохим вариантом, не в последнюю очередь потому, что легко создать реализацию, которая плохо масштабируется во многих отношениях. IMO, ваш лучший выбор в будущем будет состоять в том, чтобы выкинуть свой хэш-код из таблицы самонаведения, прежде чем он станет слишком запутанным в вашем приложении.


Комментируя ваш фактический код, я не понимаю, как хеш-таблица может возможно работать, если вы вставляете в процесс случайные числа. Ваш код непонятен с алгоритмической точки зрения ... для меня это не имеет смысла.


Если бы вы сказали нам, почему думали, что не можете использовать одну из стандартных реализаций, мы, вероятно, сможем посоветовать вам лучше.

0 голосов
/ 08 декабря 2011

Ваш код очень странный и случайный, также другой код поможет увидеть, инициализировали ли вы его (возможно, это ваша проблема), но вот моя лучшая интерпретация кода.

0 голосов
/ 08 декабря 2011

Вы создали массив для хранения 5 ArrayList<Employee>, однако вы не создали каждый из этих 5 ArrayList s для входа в массив.

Поэтому в вашем массиве нет ссылок на ArrayList<Employee> объекты, но вместо этого каждому элементу в вашем массиве присваивается начальное значение null. Из-за этого, когда вы попытаетесь использовать любой из этих несуществующих ArrayList<Employee> s, вы вызовете выброс NullPointerException.

После того, как вы создадите массив, создайте каждого отдельного ArrayList<Employee> следующим образом:

for (int i = 0; i < hash.length; i++)
   hash[i] = newArrayList<Employee>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...