Класс, представляющий набор пар ключ-значение — в 1D массиве JAVA

#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];
  

соответственно.