Nieznany wyjątek.

0

Witam, piszę dość specyficzne drzewo i natknąłem się na nieznany wyjątek w JAVIE (w Eclipse).

[code]
Exception in thread "main" java.lang.NullPointerException
at Tree.Add(TrieTree.java:35)
at TrieTree.main(TrieTree.java:81)
[/code]

Nie wiem czy debugger w Eclipse działa czy nie bo nie bardzo go kminię. Wydaje mi się że kod jest poprawny "gramatycznie".

Wykrzacza się przy próbie wywołania tej metody

//Node - klasa z kilkoma polami w tym pole Children typu List<Node>

	public Node Add(Node Element, Node Prev)
	{
		Node NewPrev = Element;
			
		boolean found = false;
		for(Node Current : Prev.Children)
		{
			if(Current.letter == Element.letter) 
			{
				NewPrev = Current;
				found = true;
				break;
			}
		}
			
		if(!found)
		{
			Prev.Children.add(Element);
			Collections.sort(Prev.Children, new Comp()); 
		}	
		return NewPrev;
	}

//wywolanie w main
	String word = "assadasda";
		
	Node Root = new Node();
	Tree Tree   = new Tree(Root);
		
	Node Prev= Root;
	for(int i = 0; i < word.length(); i++)
	{
		char letter = word.charAt(i);
		Node Element = new Node();
		Element.Parent = Prev;
		Element.letter = letter;
		Prev = Tree.Add(Element, Prev);	
	}

Będę wdzięczny za każdą wskazówkę. Pozdrawiam

3

Ech. Wywołujesz tą metodę na pustej referencji. Czyli nic nie zrozumiałeś z tego o czym pisaliśmy ci ostatnio. KAŻDY obiekt MUSISZ tworzyć za pomocą new. Ty najwyraźniej obiektu Tree na którym chcesz wywołać Add() nie utworzyłeś.
Debugger w eclipse działa. Klikasz gdzieś w kodzie prawym, dajesz "add breakpoint" a potem w eclipse klikasz debug. Resztę mam nadzieje ogarniesz.

2

Nieznany wyjątek, dobry żart. NPE to najczęstszy wyjątek w Javie. Na ogól występuje gdy wywołujesz metodę na rzecz nieskonstruowanego obiektu. Coś w rodzaju:

String s;
if(s.endsWith("jajo"))
...
0

Teraz zrozumiałem. Mam ten głupi nawyk z C++ bo tam można było zrobić coś takiego

Node * cos;

Czyli tam utworzyć wskaźnik który jeszcze nie wskazuje na żaden obiekt. Teraz operuję na referencjach ale ten mechaniczny odruch mam że zapominam o tym. Dzięki wielkie, na przyszłość będę pamiętał!

0

Hmm a czy do iteratorów też coś trzeba dodać? Trochę zmodyfikowałem tą pętlę i

Iterator<Node> it = Prev.Children.iterator();

Powoduje wystąpienie tego samego błędu (gdy zakomentuję to jest ok). Wszędzie obiekty są potworzone za pomocą new więc tutaj wszystko gra. Dodam że Prev przesyłam jako referencję przez argument metody.

2

A czy Prev.Children istnieje? BTW zarówno w C++ jak i Javie przyjmuje się konwencje że klasy piszemy z dużej litery, a pola i metody z małej...

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