View Full Version : NullPointerException bei Bsp4
tschurlo
30-11-2002, 17:55
Na supi!
Jetzt habe ich endlich einen schoenen Haufen Code getipselt und bekomme einen Haufen Exceptions, allen voran eine NullPointerException.
Hatte jemand von euch auch dieses Problem, bzw. hat schon rausgefunden, was er da falsch gemacht hat?
NullPointerExeceptions treten deshalb auf, weil der Code vom CG Institut manchmal ein paar "seltsame" VertexTables errechnet, die dein Code dann füllen muss -> schau in meinen Thread "Doppele Vertices" in der CG Newsgroup, dort haben schon mehrere Leute gepostet...
Das NullPointerException Problem tritt deshalb auf, weil bei doppelten Vertices das Verkürzen durch die Variable yPrev nicht immer funktioniert (wenn idente Vertcies aufeinanderfolgen) und deshalb manchmal eine ungerade Anzahl an Kanten in der ActiveList stehen kann, weshalb dann die NullpointerException geworfen wird, da man ja immer "blind" je zwei Edges auf einmal aus der ActiveList in fillScan() holt...
Lösung dafür: eine Methode yPrev() ähnlich wie yNext() implementieren...
Sollten andere Exceptions (du sprichst ja von mehreren) wie ArrayOutOfBounds etc... auftreten, liegt der Fehler vermutlich eher in deinem Code, vielleicht zuviel Schleifendurchläufe oder Ähnliches...
tschurlo
01-12-2002, 15:51
Danke, hat sich mittlerweile schon erledigt, ich habe in der Liste immer auf einen Edge zu weit gezeigt.
Ich würde dir trotzdem die yPrev() Methode empfehlen, macht den Code insgesamt robuster...
und nix ist peinlicher, als wenn dir beim Abgabegespräch plötzlich die segfaults, sorry, NullPointerExceptions um die Ohren fliegen...
leobasil
01-12-2002, 18:23
noch eine frage, die bei mir im zusammenhang mit nullpointern auftritt:
CG1EdgeList edges[] = new CG1EdgeList[512];
is das gültig ? weil ja der konstruktor nicht mit () aufgerufen wird ... und meine nullpointer sind bei der ersten verwendung von edges.... aber wie müsste das dann gehen ? dass ich ein array aus der liste erstell ?
....dasselbe beschissene problem hab ich auch....
hab ein listenarray als Feld von CG1EdgeList mit der Größe canvas.getHeight erstellt und krieg jetzt auch permanent NullPointerExceptions.... keine ahnung wieso.....
vielleicht weiß da jemand rat?
DancingComet
01-12-2002, 18:58
also daran können die exceptions nicht liegen, ich hab das auch so gemacht, und ich krieg keine exceptions....
oksi..... so blöd kann man sein.... prompt geschrieben, is mir auch des rätsels lösung dazu eingefallen:
nach der deklaration -> CG1EdgeList elist[] = new CG1Edgelist[canvas.getHeight()]
sollte man das ganze auch initialisieren in er schleife von 0 bis canvas.getHeight -> for (int i = 0; i < canvas.getHeight(); i++)
{
elist[i] = new CG1EdgeList();
}
naja.....
Deep Thought
02-12-2002, 11:22
Original geschrieben von gck
Ich würde dir trotzdem die yPrev() Methode empfehlen, macht den Code insgesamt robuster...
und nix ist peinlicher, als wenn dir beim Abgabegespräch plötzlich die segfaults, sorry, NullPointerExceptions um die Ohren fliegen...
Und wetten wir, dass die Musterlösung das wieder ignoriert...:D
Und wetten wir, dass die Musterlösung das wieder ignoriert...:D
Aber hundert-prozentig...
Ich hab mir für die letzten drei BSP schon viel zu viel angetan, hab jetzt einfach einen simplen try-catch Block um das fillScan gemacht - funktioniert (meiner Meinung nach) perfekt.
Ist auch viel effizienter, als zuerst alle doppelten Knoten und Kanten herauszufiltern...
bei welchen objekten treten denn die exceptions auf ?
habt ihr testobjekte ?
Original geschrieben von Deep Thought
Und wetten wir, dass die Musterlösung das wieder ignoriert...:D
glaub net, denn dann würden sie ja auch exceptions bekommen... aber kann sein, dass sie net das problem beheben, sondern einfach das symptom, indem sie in fillScan einfach überprüfen, ob die zweite kante auch net null is...
wie genau soll denn das yPrev() jetz ausschaun
habs so wie yNext() gemacht, nur halt in die andere richtung
jetz kommen bei mie aber bei allen objekten NullPointerExceptions
:(
mfg claudia
Ich hab es auch gar nicht implementiert, weil es dauernd neue, andere Fehler erzeugt hat. Zum Beispiel hat danach das Kürzen der Kanten bei "doppelten" Punkten nicht mehr funktioniert.
Und nachdem man sich laut Angabe an den Code aus dem Buch halten soll, hab ich die Funktion yPrev() weggelassen, und nur die Symptome (NullPointer) mit einem try/catch und einer Überprüfung
while ((p1!=null)&&(p1.next!=null))
behandelt. :verycool:
Bei den ganzen 3d-Dingern werden zwar nur einfache Dreiecke verwendet aber trotzdem mal zum Testen das Polygon aus dem Buch (S118)
ATOFF
9 0 1 0 1
-1 -1 0
1 -1 0
1 0.5 0
0.5 -0.7 0
0.5 0 0
0 1 0
-0.25 0.8 0
-0.5 1 0
-1 0.6 0
68 170 187
9 0 1 2 3 4 5 6 7 8 0 -1 0
kewl danke
funkt fein
bloede frage:
wieso kommt da ueberhaupt die nullpointerexception?
hm, ich mein die horizontalen kanten sind doch eh ausgeschlossen worden (also auch idente punkte) ...
Die Nullpointerexceptions kommen daher, dass eine ungerade Anzahl von Kanten in der Activelist stehen können, da yPrev wie's im Buch ist, nicht ordentlich funktioniert, z.b. bei doppelten Vertices oder horizontalen Linien:
Wenn du yNext() anschaust, siehst du sofort, dass aufgrund der while() Schleife horizontale Linien (also selbe Y) "übergangen" werden, da wir ja wissen wollen, ob das Polygon rauf oder runter weitergeht... bei der yPrev Implementierung nehma immer das letzte Y -> horizontale Linien verursachen Probleme, da damit die Aussagekraft über den Anstieg der letzten Kanten verhaut wird i.e. horizontale Kanten werden hier NICHT ignoriert... daher ist die einzig korrekte Implementierung des Algorithmus nur über ein zusätzliches yPrev() als Funktion möglich, die horizontale Kanten auch ignoriert, so wie yNext()...
Du kannst natürlich auch Exceptions catchen oder einfach zu zeichnen aufhören, wenn dir eine Edge in der Activelist "überbleibt", aber das sind sozusagen "suboptimale" Lösungen...
hmm, habs eh schon laengst davor hingekriegt ...
also ich hab bei dem yPrev auch immer (i) genommen statt (i-1) bzw. (anz-1) naja bin eh davor auch draufgemommen
danke trotzdem jedenfalls :)
lg und gute nacht claudi
Deep Thought
04-12-2002, 20:40
OK die Musterlösung produziert doch keine NULL Pointer Exceptions, aber kann mir jemand erklären, warum sie yPrev in der Routine buildCG1EdgeList "mitschleppen", wenn's eh nicht gebraucht wird?
Also der einzige Unterschied (und zwar der, der die NPointer erzeugt/verhindert) den ich gefunden habe,
ist dass sie auf das yPrev komplett verzichten und ihre upper_Y immer um eins verringern, und nicht wie im Buch beschrieben, nur wenn if (upper[Y]<yCompare)
kleiner Trick - große Wirkung - aber uns völlig unbekannt
Florian
Original geschrieben von Filz
kleiner Trick - große Wirkung - aber uns völlig unbekannt
Und dafür LIEBE ich musterlösungen...
tschurlo
05-12-2002, 10:08
Finde ich auch irgendwie eigenartig. Da wird lang und breit im Buch erklaert, wann man minus 1 rechnen soll und wann nicht und dann machen sie es einfach immer. Also die optimale Loesung kann das auch nicht sein.
vBulletin® v3.7.1, Copyright ©2000-2008, Jelsoft Enterprises Ltd.