NullPointerException przy dodawaniu elementów

0

Witam wszystkich,
Pojawia mi się problem przy kompilacji. Miejsca podejrzane o błędy zaznaczyłem pseudostrzałkami.
Kod:
Main.java

import java.util.Random;

public class Main {
    public static void main(String[] args) {
        System.out.println("Tworzenie listy: ");
        ListaKart lista=new ListaKart();
        Random rand=new Random();
        int w;
        int i=0;
        while((w=rand.nextInt(14))!=0) {
            int k=rand.nextInt(4);
            Karta kart=new Karta(w,k);
/*------->*/           lista.add(kart);             //<---------------
        }
        lista.wyswietlLiczbeKart();
        lista.wyswietl();
        
        System.out.println("Wywietlanie waletów: ");
        lista.wyswietlWartosc(11);
        System.out.println("Usuwanie powtorzen: ");
        lista.usunPowt();
        System.out.println("Wyswietlanie: ");
        lista.wyswietlLiczbeKart();
        lista.wyswietl();
    }
}

Karta.java

public class Karta {
    private int wartosc;
    private int kolor;
    
    public Karta(int wartosc, int kolor) {
        this.wartosc=wartosc;
        this.kolor=kolor;
    }
    
    public Karta() {
        wartosc=1;
        kolor=0;
    }
    
    public int getWartosc() {
        return wartosc;
    }
    
    public int getKolor() {
        return kolor;
    }    
}

ListaKart.java

public class ListaKart implements Lista {
    private final static int DEFAULT_INITIAL_CAPACITY=1;
    private final int _initialCapacity;
    private int _size=0;
    private Karta[] _array;
    
    public ListaKart() {
        this(DEFAULT_INITIAL_CAPACITY);
    }
    
    public ListaKart(int initialCapacity) {
        _initialCapacity=initialCapacity;
    }
    
    public ListaKart(Karta[] array) {
        _initialCapacity=array.length;
        clear();
        System.arraycopy(array, 0, _array, 0, array.length);
        _size=array.length;
    }
    
/*------>    public void insert(int i, Karta value) throws IndexOutOfBoundsException {
        if (i<0 || i>_array.length) throw new IndexOutOfBoundsException();
        ensureCapacity(_size+1);
        System.arraycopy(_array, i, _array, i+1, _size-i);
        _array[i]=value;
        ++_size;
    }

    public void add(Karta value) {
        insert(size(),value);
    }
//<---------->
    public Karta delete(int i) throws IndexOutOfBoundsException {
        checkOutOfBounds(i);
        Karta value=_array[i];
        int copyFrom=i+1;
        if (copyFrom<_size)
            System.arraycopy(_array, copyFrom, _array, i, _size-copyFrom);
        --_size;
        return value;
    }

    public boolean delete(Karta value) {
        int index=indexOf(value);
        if (index!=-1)
            delete(index);
        return index!=-1;
    }

    public void clear() {
        _array=new Karta[_initialCapacity];
        _size=0;
    }

    public Karta set(int i, Karta value) throws IndexOutOfBoundsException {
        checkOutOfBounds(i);
        Karta oldValue=value;
        _array[i]=value;
        return oldValue;
    }

    public Karta get(int i) throws IndexOutOfBoundsException {
        checkOutOfBounds(i);
        return _array[i];
    }

    public int indexOf(Karta value) {
        int i=0;
        while (i<_size && value.equals(_array[i]))
            i++;
        return i<_size ? i : -1;
    }

    public boolean contains(Karta value) {
        return indexOf(value)!=-1;
    }

    public int size() {
        return _size;
    }

    public boolean isEmpty() {
        return _size==0;
    }
    
    private void ensureCapacity(int capacity) {
        if (_array.length<capacity) {
            Karta[] copy=new Karta[capacity+1];
            System.arraycopy(_array, 0, copy, 0, _size);
            _array=copy;
        }
    }
    
    private void checkOutOfBounds(int i) {
        if (i<0 || i>=_array.length) throw new IndexOutOfBoundsException();
    }
    
    public void wyswietlLiczbeKart() {
        System.out.println("Ilosc kart: "+size());
    }
    
    public String getStringWart(int i) {
        switch (i) {
                case 1: return "As";
                case 11: return "Walet";
                case 12: return "Dama";
                case 13: return "Krol";
            default: return ""+i;
            }
    }
    
    public String getStringKolor(int i) {
        switch(i) {
            case 0: return "Kier";
            case 1: return "Karo";
            case 2: return "Trefl";
            case 3: return "Pik";
            default: return "";
        }
    }
    
    public void wyswietl() {
        for (int i=0;i<size();i++) {
            System.out.printf("%-7s-%-7s\n", getStringWart(_array[i].getWartosc()), getStringKolor(_array[i].getKolor()));
        }
    }
    
    public void usunPowt() {
        for (int i=0;i<size();i++) {
            int pom=i;
            for (int j=i+1;j<size();j++)
                if (!_array[i].equals(_array[j]))
                    _array[++pom]=_array[j];
            _size=++pom;
        }
    }
    
    public void wyswietlWartosc(int i) {
        for (int in=0;in<size();in++) {
            if (_array[in].getWartosc()==i) 
                System.out.printf("%-7s-%-7s\n", getStringWart(_array[i].getWartosc()), getStringKolor(_array[i].getKolor()));
        }
    }
    
    }

I jeszcze treść błędu: Exception in thread "main" java.lang.NullPointerException
at aisdlabzad3.ListaKart.insert(ListaKart.java:25)
at aisdlabzad3.ListaKart.add(ListaKart.java:33)
at aisdlabzad3.Main.main(Main.java:15)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)

0
public class ListaKart implements Lista {
    private final static int DEFAULT_INITIAL_CAPACITY=1;
    private final int _initialCapacity;
    private int _size=0;
    // -----> private Karta[] _array;

tablica _array jest null, zmień jeden z konstruktorów

    public ListaKart(int initialCapacity) {
        _initialCapacity=initialCapacity;
        _array=new Karta[_initialCapacity];
    }

Znacznie wygodniejsze w tym programie byłoby użycie do przechowywania kart kolekcji

import java.util.Random;

public class Main {
    public static void main(String[] args) {
        System.out.println("Tworzenie listy: ");
        ArrayList<Karta> lista=new ArrayList<Karta>();
0

A gdzie inicjujesz _array w liście?

1 użytkowników online, w tym zalogowanych: 0, gości: 1