PDA

View Full Version : [PROBLEM] - NullPointerException in clipPoint


- TeMET_noSCE -
15-10-2004, 18:23
die CG1Polygon lässt sich zwar kompilieren, aber wenn ich im Programm CG1Main eine Linie oder sonst irgendein Objekt einfügen will bekomm ich nur eine NullPointerException in clipPoint:
...
if(edge < TOP) clipPoint(iPt, edge+1);
} else {
clipped[cnt][X] = (int)iPt.x; //hier wird die Exception geworfen!
clipped[cnt][Y] = (int)iPt.y;
depth[cnt] = iPt.z;
cnt++;
numVertex++;
}
}
s[edge] = point;
etc.
hat da jemand eine spontane idee??? ich kann meinen code schon auswendig so oft hab ich ihn durchgekaut und nix gefunden ...:confused:

- TeMET_noSCE -
15-10-2004, 18:39
danke für die schnelle antwort, aber wieso sollte ich an dieser stelle ein "break" einfügen? if(first[edge]==null)
first[edge] = point;
else{
if(cross(point, s[edge], edge)) {
iPt = intersect(point, s[edge], edge);
if(edge < TOP) clipPoint(iPt, edge+1); //!!!
} else {
clipped[cnt][X] = (int)iPt.x;
clipped[cnt][Y] = (int)iPt.y;
depth[cnt] = iPt.z;
cnt++;
numVertex++;
}
}

Wings-of-Glory
15-10-2004, 18:39
protected void clipPoint (CG1Point point, int edge)
{
CG1Point iPt = null; // <-- FEHLER
// RICHTIG: CG1Point iPt = new CG1Point();
if(first[edge]==null)
first[edge] = point;
else{
if(cross(point, s[edge], edge)) {
iPt = intersect(point, s[edge], edge);
if(edge < TOP) clipPoint(iPt, edge+1);
} else {
clipped[cnt][X] = (int)iPt.x; //hier wird die Exception geworfen!
clipped[cnt][Y] = (int)iPt.y;
depth[cnt] = iPt.z;
cnt++;
numVertex++;
}
}
s[edge] = point;
etc.

Wings-of-Glory
15-10-2004, 18:41
danke für die schnelle antwort, aber wieso sollte ich an dieser stelle ein "break" einfügen? if(first[edge]==null)
first[edge] = point;
else{
if(cross(point, s[edge], edge)) {
iPt = intersect(point, s[edge], edge);
if(edge < TOP) clipPoint(iPt, edge+1); //!!!
} else {
clipped[cnt][X] = (int)iPt.x;
clipped[cnt][Y] = (int)iPt.y;
depth[cnt] = iPt.z;
cnt++;
numVertex++;
}
}
sorry, blödsinn.. hab mich bei der methode verschaut.
der fehler liegt vielleicht hier:

- TeMET_noSCE -
15-10-2004, 18:41
arrrgh!!!!!!!:hewa:
vielen dank!
tja, mit java sollte man halt umgehen können... (wie konnte ich nur eprog schaffen...?)

- TeMET_noSCE -
15-10-2004, 19:19
die freude war nur von kurzer dauer, denn jetzt hab ich anstelle der NullPointerException eine ArrayIndexOutOfBoundsException:
protected void clipPoint (CG1Point point, int edge)
...
s[edge] = point;
if(inside(point, edge))
if(edge < TOP) clipPoint(point, edge+1); //Hier tritt die neue Exception auf!
else {
clipped[cnt][X] = (int)point.x;
clipped[cnt][Y] = (int)point.y;
depth[cnt] = point.z;
cnt++;
numVertex++;
}


mein hauptproblem scheint weniger der algorithmus als viel mehr java zu sein...

thebigMuh
15-10-2004, 19:27
Du hast nicht zufälligerweise die Definition für LEFT, BOTTOM, RIGHT und TOP irgendwie geändert?

Ciao, ¡muh!

EDIT: Außerdem macht man normalerweise bei if statements um beide Blöcke {} herum, wenn ich die ifs dort oben anschau stellen sich bei mir die Nackenhaare auf.

EDIT2: err. Ich nehm' sogar fast an, daß dort dein Fehler liegt. Sieh mal her:


if (inside...)
if (edge < TOP)
clipPoint...

// zu welchem if statement gehört dieses else jetzt?
else
{
}


Probier mal das:


if (inside...)
{
if (edge < TOP)
{
clipPoint...
}
else
{
....
}
}

- TeMET_noSCE -
15-10-2004, 20:14
Du hast nicht zufälligerweise die Definition für LEFT, BOTTOM, RIGHT und TOP irgendwie geändert?

Ciao, ¡muh!

EDIT: Außerdem macht man normalerweise bei if statements um beide Blöcke {} herum, wenn ich die ifs dort oben anschau stellen sich bei mir die Nackenhaare auf.
deine nackenhaare können sich wieder beruhigen...ich hab ein paar {{{}}} mehr eingebaut. hat leider nix daran geändert, aber trotzdem danke für den tipp! :thumb:

thebigMuh
15-10-2004, 20:17
Stimmt das mit dem was du in CG1Polygon hast noch überein?


public static final int LEFT = 0;
public static final int RIGHT = 1;
public static final int BOTTOM = 2;
public static final int TOP = 3;


Ganz oben bei den Variablendeklarationen.

Ciao, ¡muh!

- TeMET_noSCE -
15-10-2004, 20:20
jaja klar, da pfusch ich eh nicht herum!

vermutlich hab ich irgendwo mal ein <= mit < oderso verwechselt, aber wüsst echt nicht wo... :confused:
das wird noch eine lange nacht...
danke für die hilfe!

Shodan
15-10-2004, 20:24
Ich seh nochimmer denselben Fehler wie vorhin. Zieht sich bei dir wahrscheinlich durchs ganze Programm. ALSO:

check mal alle CG1POINT initialisierungen (in allen Prozeduren und Funktionen), und wenn dort steht:
CG1Point blablabla=null; // (oder ähnliches) dann tausch das mit

CG1Point blablabla;
blablabla= new CG1Point();

.Falsche Initialisierungen nehm ich mal an.

- TeMET_noSCE -
15-10-2004, 20:34
Ich seh nochimmer denselben Fehler wie vorhin. Zieht sich bei dir wahrscheinlich durchs ganze Programm. ALSO:

check mal alle CG1POINT initialisierungen (in allen Prozeduren und Funktionen), und wenn dort steht:
CG1Point blablabla=null; // (oder ähnliches) dann tausch das mit

CG1Point blablabla;
blablabla= new CG1Point();

.Falsche Initialisierungen nehm ich mal an.an dem liegts auch nicht. hab jetzt den code noch 2 mal durchgeschaut, aber alle CG1Point so initialisiert. :(

cypher
15-10-2004, 20:51
protected void clipPoint (CG1Point point, int edge)
{

CG1Point iPt = null;

if(first[edge]==null)
first[edge] = point;
else{
if(cross(point, s[edge], edge)) {
iPt = intersect(point, s[edge], edge);
if(edge < TOP) clipPoint(iPt, edge+1);
} else {
clipped[cnt][X] = (int)iPt.x;
clipped[cnt][Y] = (int)iPt.y;
depth[cnt] = iPt.z;
cnt++;
numVertex++;
}
}
s[edge] = point;
if(inside(point, edge))
if(edge < TOP) clipPoint(point, edge+1); //Hier tritt die neue Exception auf!
else {
clipped[cnt][X] = (int)point.x;
clipped[cnt][Y] = (int)point.y;
depth[cnt] = point.z;
cnt++;
numVertex++;
}
//JBend4<<<
}



wollte in diesem zusammenhang nochmal drauf hinweisen, dass wir euch bitten würden, KEINEN kompletten code zu posten - ich weiß schon, dass das manchmal schwierig ist und sich nicht alles so einfach in pseudocode darstellen lässt (vor allem, wenn man eine exception bekommt und nicht genau weiß, woran das liegt).
aber das wir möglichst vermeiden möchten, dass die leute die beispiele mit copy&paste aus dem forum lösen können, wird hoffentlich auch jeder verstehen ...

bitte darum nur pseudocode oder halt einzelne zeilen posten, aber komplette methoden wirklich vermeiden!!!!

danke :-)

Shodan
15-10-2004, 20:54
vielleicht hast du in der clipPoint ganz oben die Zeile:

first[b] = &p als first[edge]=&point übernommen?
ich bin auf nr.sicher und hab sie als first[edge]=new CG1Point(point) übernommen.

thebigMuh
15-10-2004, 21:04
Sollte keinen Unterschied machen, ist aber trotzdem eine gute Idee :)

Es werden nur Punkte aus dem vertices[] array in first[] landen, und die ändern sich sowieso nie, also wär auch ein Pointer nix schlimmes.

Ciao, ¡muh!

- TeMET_noSCE -
15-10-2004, 21:07
wollte in diesem zusammenhang nochmal drauf hinweisen, dass wir euch bitten würden, KEINEN kompletten code zu posten - ich weiß schon, dass das manchmal schwierig ist und sich nicht alles so einfach in pseudocode darstellen lässt (vor allem, wenn man eine exception bekommt und nicht genau weiß, woran das liegt).
aber das wir möglichst vermeiden möchten, dass die leute die beispiele mit copy&paste aus dem forum lösen können, wird hoffentlich auch jeder verstehen ...

bitte darum nur pseudocode oder halt einzelne zeilen posten, aber komplette methoden wirklich vermeiden!!!!

danke :-)
sorry, wird nicht mehr vorkommen.

brain
15-10-2004, 22:07
kurze frage am rande:

brauch ich das

"numVertex++;"

überhaupt? Und wenn ja wieso?

thebigMuh
15-10-2004, 22:54
Wenn du vorher numVertex auf 0 setzt, dann ja. Irgendwo mußt du ja mitzählen, wie viele Punkte im clipped[][] und depth[] landen.

Ciao, ¡muh!

brain
15-10-2004, 23:08
naja ist das dann nicht eh cnt?

Moby
15-10-2004, 23:15
Wenn man am Anfang auf numVertex = 0 setzt wird aber nur ein Punkt ganz links oben gezeichnet.... :tongue1:

Ich hab das Problem auch, dass es mir eine OutofBoundsExcpetion schmeißt, aber nur wenn ich Polygone zeichne, die clippen... Wenn ich am Anfang nämlich bei vertices.length bleibe, wo muss ich dann raufzählen.... beispielsweise beim GrosserStern.atoff tritt ja der Fall auf, dass durch das mehrfache clipping statt den 8 auf einmal zwölf Vertices zu zeichnen sind. Beim Clippen kann ich also nicht zählen, weil man 8 mal clippt und numVertex auf 16 gesetzt würde --> daher die exception.

Shodan
15-10-2004, 23:38
Warum so kompliziert? Wir arbeiten hier mit JAVA! einfach am Ende

numVertex=depth.length;

setzen, und gut is....

thebigMuh
15-10-2004, 23:41
depth[] wird am Anfang auf 2 * numVertex + 1 initialisiert.

Da beim Clippen im allgemeinen Punkte entfernt werden, ist numVertex dann wohl zu groß...

Ciao, ¡muh!

thebigMuh
15-10-2004, 23:44
Moby: Wieso kannst du beim Clippen nicht mitzählen? Du mußt ja alle Punkte in das clipped[][] und depth[] reinschreiben, die geclippten genauso wie diejenigen originalen Punkte, die den clipping Test bestehen. Einfach jedes Mal, wenn du in das clipped[][] hineinschreibst, numVertex um 1 erhöhen.

Funktioniert. Ganz sicher.

Ciao, ¡muh!

Moby
15-10-2004, 23:58
Moby: Wieso kannst du beim Clippen nicht mitzählen? Du mußt ja alle Punkte in das clipped[][] und depth[] reinschreiben, die geclippten genauso wie diejenigen originalen Punkte, die den clipping Test bestehen. Einfach jedes Mal, wenn du in das clipped[][] hineinschreibst, numVertex um 1 erhöhen.

Funktioniert. Ganz sicher.

Ciao, ¡muh!
das hab ich auch eigentlich schon probiert, nur durchläuft die Schleife in clip() ja dann kein einziges mal... oder wie kann man sie ändern, dass sie mit der richtigen Anzahl durchlaufen wird?

Shodan
16-10-2004, 00:02
Thanks Muh! Das war der Fehler, an dem ich seit Stunden herumbastel. Das Ding hat mir nämlich immer ein paar Linien zuviel gemalt, obwohl der Rest stimmte.

Danke nochmals. Darauf wär ich nie gekommen....

thebigMuh
16-10-2004, 00:55
Bidde gerne :)

Moby: Naja, entweder do kopierst numVertex einfach in eine neue Variable, bevor du die Schleife durchläufst, oder du verwendest vertices.length als Obergrenze, denn AFAIK hat vertices[] die richtige Länge :)

Ciao, ¡muh!

Moby
16-10-2004, 01:02
OK, dankeschön :thumb:

Es passt jetzt endlich *schwitz* :D

- TeMET_noSCE -
16-10-2004, 15:06
jetzt haben sich gerade meine nackenhaare aufgestellt!!!!

thebigmuh hat recht gehabt, ich hab wirklich bei einem if/else eine } vergessen!!! :ahhh:
jetzt läuft es wie geschmiert!!! :) (nur z-Koordinate muss ich noch ausrechen)
ich möcht mich an dieser stelle recht herzlich bei allen bedanken die geholfen haben! :bounce: ohne euch hätt ich den fehler sicher länger nicht gefunden, wenn überhaupt...

SeeS
16-10-2004, 23:27
ich hab' den code einmal vom buch auf java umgeschrieben, und ich weiß nicht warum aber ich bekomme schon in der inside funktion bei
case LEFT: if(point.x < wMin.x) return false; break;
- eine nullpointerexception

hat irgendwer einen schimmer was ich falsch gemacht hab'

thebigMuh
17-10-2004, 00:41
Kann mir nur vorstellen, daß du als point einen null-Wert übergibst...

Mach mal sowas ganz am Anfang der Funktion:


if (point == null)
System.out.println("Waaah! point ist null!");


Wenn in der Konsole "Waaah! point ist null!" auftaucht, mußt du halt versuchen herauszufinden, warum da ein null übergeben wird...

Einfacher geht's natürlich direkt im Debugger mit durchsteppen.

Ciao, ¡muh!

SeeS
17-10-2004, 11:11
Danke für den Tipp - jetzt beginnt die große Fehlersuche :(

n3x
18-10-2004, 08:16
if(edge < TOP) clipPoint(point, edge+1); //Hier tritt die neue Exception auf!
das kann nicht sein, weil du hier überhaupt kein array-element referenzierst. ich nehme mal an, die exception tritt in der methode clipPoint auf, die du hier aufrufst? jedenfalls musst schaun, in welcher zeile die exception urprünglich geworfen wird.

übrigens wäre der debug-output genauer, wenn du alle if- und else-blöcke in klammern tun und den inhalt eines blocks immer auf einer neuen zeile beginnen würdest. wie schon vorhin jemand gesagt hat ... nackenhaare und so ...