Exception in thread "AWT-EventQueue-0" java.lang.N

0

Witam,

mam problem z synchronizacją danych. Napisałem klasę(model), która przechowuje strukturę w postaci listy powiązanej. Model ten posiada metodę, która dodaje elementy do struktury lub je zmienia, oraz metodę która zwraca strukturę.

w pewnym miejscu w moim programie wywoluje metode, ktora zwraca strukture modelu, tworze iterator i przegladam, ta strukture.

Czasem zdarza się, że program zwraca mi wyjątek:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointer

Sprawdziłem co to oznacza i w tym przypadku chodzi o to, ze czasem podczas przeglądania struktury(iterowania jej) następuje jej zmiana(przez metode z modelu) - stad ten wyjątek.

Z tego co się orientuje, to synchronized mi tu nie pomoże, próbowałam coś z semaforami, które mogą być moim rozwiązaniem, ale niestety za bardzo ich nie rozumiem.

Poniżej zamieszczę okrojony kod i będę wdzięczny za jakąś podpowiedź:

public class Model
{
//struktura przechowujaca punkty
private LinkedList<element> body = new LinkedList<element>();

public Model(Element startPosition, int lenghtBody)
{
    body.add(startPosition);
    this.addTail(lenghtBody - 1);
}

public void addTail(int lenght)
{
    //dodaje do struktury ogon o podanej dlugosci        
}

public void moveModel(Direction inDirection)
{
    //zmienia dane na strukturze
}
public LinkedList<Element> getBody()
{
    return body;
}

}

Gdzies w programie czesto wykonywane jest kod:

...

body = model.getBody();
Iterator iter = body.iterator();

while(iter.hasNext())
{
element = iter.next();
System.out.println(element);
}

0

A listy synchronizowanej nie ma w API ;)

http://java.sun.com/j2se/1.5.[...]ncurrent/package-summary.html

Dodatkowo możesz przed użyciem w newralgicznym punkcie wstawić ifa, który sprawdzi czy nie ma null.

ps. AWT ma też problem z procesorami wielordzeniowymi i czasami sypie rożnymi dziwnymi błędami.

0
Koziołek napisał(a)

A listy synchronizowanej nie ma w API ;)

http://java.sun.com/j2se/1.5.[...]ncurrent/package-summary.html

Dodatkowo możesz przed użyciem w newralgicznym punkcie wstawić ifa, który sprawdzi czy nie ma null.

ps. AWT ma też problem z procesorami wielordzeniowymi i czasami sypie rożnymi dziwnymi błędami.

Witam,

faktycznie sprawdziłem w dokumentacji, listy synchronizowanej nie ma w api :/
Z tym if'em trochę kombinowałem, ale za bardzo nie wiem gdzie go wstawić:

while(iter.hasNext())
{
el = (Element) iter.next(); //<- tu sie wysypuje
//...

    }

Czy istnieje jakaś alternatywa standardowej synchronizowanej struktury dla listy powiązanej ?
Albo można jakoś zmodyfikować mój kod żeby działał poprawnie ?

p.s. poniżej dosyć istotny cytat z dokumentacji:

The iterators returned by the this class's iterator and listIterator methods are fail-fast: if the list is structurally modified at any time after the iterator is created, in any way except through the Iterator's own remove or add methods, the iterator will throw a ConcurrentModificationException. Thus, in the face of concurrent modification, the iterator fails quickly and cleanly, rather than risking arbitrary, non-deterministic behavior at an undetermined time in the future.

Note that the fail-fast behavior of an iterator cannot be guaranteed as it is, generally speaking, impossible to make any hard guarantees in the presence of unsynchronized concurrent modification. Fail-fast iterators throw ConcurrentModificationException on a best-effort basis. Therefore, it would be wrong to write a program that depended on this exception for its correctness: the fail-fast behavior of iterators should be used only to detect bugs.

0
__krzysiek85 napisał(a)

http://java.sun.com/javase/6/[...]chronizedList(java.util.List)

Dzięki za nakierowanie mnie na odpowiedz :-)

A teraz wyjaśnienie dla tych, którzy będą mieli podobny problem:

"Gdy dostep do kolekcji odbywa sie z wielu watkow, staje sie konieczne zastosowanie synchronizacji. ...
Projektanci Javy dostarczyli mechanizm, ktory umozliwia tworzenie synchronizowanych widokow wszystkich kolekcji. "

Rozwiazaniem jest temat "Widoki synchronizowane", milego czytania :)

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