#java #arrays #nullpointerexception
#java #массивы #исключение nullpointerexception
Вопрос:
Я попытался реализовать класс, представляющий набор пар ключ-значение, но я получаю NullPointer при попытке добавить какой-либо элемент в object . Проблема в том, как реализовать этот класс в классическом массиве — я пытаюсь объявить пустой массив в начале, а затем заполнить его в конструкторе.
public class ZbiorNaTablicy extends Zbior{
public Para[] pary; //array representing set
private int index=0; //index of last added object
Para pusta=new Para("pusta_para", 0);
public ZbiorNaTablicy()
{
Para[]pary=new Para[20];
for(int i=0;i<20;i )
{
pary[i]=new Para("pusta_para",i); //i fill array with some elem
}
}
public ZbiorNaTablicy(int rozmiar) {
if(rozmiar<2) {
throw new IllegalArgumentException("Ta para juz jest w zbiorze");
}
Para[]pary=new Para[rozmiar];
for(int i=0;i<rozmiar;i )
{
pary[i]=new Para("pusta_para",i); //filling array with same key elements
//after adding they will be replaced
}
}
public Para szukaj (String s)
{
for(int i=0;i<index;i )
{
if((pary[i].klucz).equals(s))
{
return pary[i];
}
}
return pusta;
}
public void wstaw (Para p) throws IllegalArgumentException //here i get NullPointer
{
if(index>=pary.length) throw new IllegalArgumentException("Zbior pelny");
boolean t=false;
for(int i=index;i<pary.length;i ) {
if(pary[i].klucz.equals("pusta_para"))
{
pary[i]=p; //NullPointer - despite the fact that array is filled
index ;
t=true;
break;
}
}
if(t==false) {
throw new IllegalArgumentException("Ta para juz jest w zbiorze");
}
}
public void usun (String k) {
int rozmiar=pary.length;
Para[] set2=new Para[rozmiar-1];
for(int i=0,l=0;i<index;i )
{
if(pary[i].klucz.equals(k))
{
continue;
}
set2[l ] = pary[i];
}
pary=set2;
}
public double czytaj (String s) throws IllegalArgumentException
{
if(szukaj(s).equals("pusta_para")) throw new IllegalArgumentException("Pary z danym kluczem nie ma w zbiorze");
else
{
return szukaj(s).getWartosc();
}
}
public void ustaw (Para p) throws IllegalArgumentException
{
if(szukaj(p.klucz).equals("pusta_para")) wstaw(p);
else
{
szukaj(p.klucz).setWartosc(p.getWartosc());
}
}
public int ile ()
{
return index;
}
public void czysc ()
{
index=0;
pary=new Para[20];
pary[0]=pusta;
}
}
Почему NullPointer происходит, когда массив не пуст — я не меняю null на другой объект в функции wstaw()??
Ответ №1:
Para[]pary=new Para[20];
создает новую локальную переменную внутри конструктора. Это затмит фактическую переменную класса pary
.
Вам нужно изменить строки
Para[]pary=new Para[20];
и
Para[]pary=new Para[rozmiar];
Для
pary=new Para[20];
и
pary=new Para[rozmiar];
соответственно.