Null pointer ex. w JTree

0

Witam.

Podczas pisania mojej aplikacji napotkałem wyjątek NULL POINTER EXCEPTION podczas korzystania z komponentu JTree. Na formularzu mam dwa koponenty JTree i podczas kliknięcia na jeden z nich zawartość drugiego się zmienia. Musiałem zatem usuwać zawartość drugiego drzewa i wczytywać węzły od początku (z innego pliku XML). Jeśli zrobię wszystko intuicyjnie (tzn. ustawiam focus na pierwsze drzewo i zmieniam zaznaczony element) to w drugim wyświetla się wszystko elegancko.
Ale jeśli najpierw zaznaczę element w drugim drzewie (na początku jest tam tylko 1 element - korzeń - zawierający łańcuch String) i potem kliknę na pierwsze drzewo to wyskakuje wyjątek. Zauważyłem, że wystapienie wyjątku powoduje metoda: reload(); wywoływana na rzecz modelu drzewa. Ma ktoś pomysł co to może być?

(cały projekt mam na lapie, więc kod wrzucę w ciągu następnych paru dni)

Całość wygląda mniej więcej tak:

  • tworzenie drzew:
    1. tworzę obiekt DefaultMutableNode będący korzeniem
    2. tworzę nowy model drzewa w konstruktorze podając w.w. korzeń
    3. tworzę komponent JTree w konstruktorze podając model z pkt. 2
  • obsłua kliknięcia:
    1. zaimplementowany interfejs z metodą valueChange
    2. jeśli zdarzenie pochodzi od Drzewa1 to uruchom parser, wczytaj dane i przeładuj Drzewo2
      jeśli od Drzewa2 - przetwarzaj elementy zachowane w Drzewie 2
  • dzialanie poprawne:
    (focus na Drzewo1) -> wybranie elemmentu Drzewa1 -> update Drzewa2 -> wybranie elementu Drzewa2 - > przetwarzanie Drzewa 2
  • wystąpienie wyjątku:
    (focus na Drzewo2 i zaznaczony jego korzen jako jedyny element) -> wybranie elementu Drzewa1 -> update Drzewa2 (wyjątek)

Update Drzewa 2 polega na wykasowaniu wszystkich dzieci korzenia i wczytanie nowych z pliku XML.
Czy ktoś ma jakiś pomysł? Wygląda to tak, jakby wywoływanie metody RELOAD musiałoby wystąpić jedynei podczas braku zaznaczenie elementu drzewa2.
Może wiecie jak w prosty sposób usunąć zaznaczenie w JTree? To takie "obejście" problemu, ale w ostateczności sie nim zadowolę.

(Sorki za brak kodu, wiem, że to mało profesjonalne, ale serio nie mogę teraz odpalać lapa i przegrywać wszystko na PC'ta. Postaram się to dorzucić rano.)

Pozdrawiam!

0

Musisz sobie odpowiedzieć na podstawowe pytania:

  1. Kiedy wyrzucany jest NullPointerException?
    Oczywiście wtedy, gdy odwołujesz się do obiektu, który nie został utworzony. Jest nullem.
  2. Który obiekt jest null'em?
    Ten, którego wywołanie wpisane jest w linijce kodu podanej przez wyjątek.

Obiekt trzeba utworzyć i po problemie ;).

0

No właśnie problem w tym, że obiekt jest na 100% utworzony... :/ Jest tworzony podczas tworzenia obiektu mojej klasy jeszcze przed konstruktorem.

private DefaultMutableTreeNode courseRoot = new DefaultMutableTreeNode(
"string");
private DefaultMutableTreeNode contentRoot = new DefaultMutableTreeNode(
"jakis string");
private DefaultTreeModel contentTreeModel = new DefaultTreeModel(contentRoot);
private DefaultTreeModel courseTreeModel = new DefaultTreeModel(courseRoot);
private JTree courseTree = new JTree(courseTreeModel);
private JTree courseContentTree = new JTree(contentTreeModel);

Tworzenie parsera i wczytywanie z XML:

private void updateContentTreeView() {
// Loading necessary data from "map" xml file and updating treeView.
try {
SAXParser p = saxPF.newSAXParser();
DefaultHandler handler = new CourseXMLDataHandler();
p.parse(selectedCourse.getSource(), handler);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (NullPointerException e) {
// WLASNIE TUTAJ WYLAPUJE TEN WYJATEK!
JOptionPane.showMessageDialog(this,"Error reading content data!");
}
}

A tutaj miejsce wystapienia wyjatku:

public void startElement(String uri, String localName, String qName,
Attributes atr) throws SAXException {
super.startElement(uri, localName, qName, atr);
if (qName.equals("root")){
// Usuwanie wszystkich dzieci korzenia
contentRoot.removeAllChildren();
// "Odswiezenie" zawartosci komponentu JTree. Repaint() nie dawalo pozadanego rezultatu
// Wlasnie ta linijka powoduje wystapienie wyjatku. Moge ja usunac i wszystko dziala poprawnie,
// lecz nie widac zmian w komponencie.
contentTreeModel.reload(contentRoot);

        } 

}

0

Nie odpowiedziałeś na postawione pytania.

SAXParser p = saxPF.newSAXParser();
DefaultHandler handler = new CourseXMLDataHandler();
p.parse(selectedCourse.getSource(), handler);

Skoro w/w kod wywołuje NullPointerException to problem jest w jednej z linijek. Dwie pierwsze nie budzą zastrzeżeń. Kolejne pytanie:

  1. Co zwraca metoda selectedCourse.getSource()?
0
Luuki napisał(a)

Nie odpowiedziałeś na postawione pytania.

SAXParser p = saxPF.newSAXParser();
DefaultHandler handler = new CourseXMLDataHandler();
p.parse(selectedCourse.getSource(), handler);

Skoro w/w kod wywołuje NullPointerException to problem jest w jednej z linijek. Dwie pierwsze nie budzą zastrzeżeń. Kolejne pytanie:

  1. Co zwraca metoda selectedCourse.getSource()?

selectedCourse.getSource() zwraca Stringa i wszstko z nią jest OK - sprawdziłem.

A co do pierwszego Twojego spostrzeżenia:
parser odpala się bez problemu i wszystko działa chyba w nim OK. Tak jak pisałem wcześniej, to metoda wywoływana na rzecz obiektu contentTreeModel wywołuje wyjątek. A może źle to rozumiem?

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