PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit struct in Java



dimevit
08-02-2008, 23:08
Hi zusammen,

in Java hab ich mir ein class definiert:


public class Point{
int x;
int y;
int z;
}


um ein 3D Punkt zu definieren. Dann in einer anderen class,
will ich ein Vector von 3D Punkten definiern:



public class Projection
.....
.....
public static void main(....){
Point point = null;
Vector<Point> points = null;

point.x = 10;
point.y = 20;
point.z = 30;

points.add(point);
}
}


das Problem ist, das ich nicht verstehen kann, warum ich eine NullPointerExeption bekomme. Was kann da falsch sein?

Danke,
Dime

peschmae
09-02-2008, 10:05
Du setzt den Pointer "point" auf "null". Ist doch logisch ist der nachher null und du kriegst eine Nullpointerexception...

Besser wäre:
Point point = new Point();

Dasselbe auch für einen Vektor.

MfG Peschmä

bischi
09-02-2008, 10:10
Zu spät :D Ach ja: Erstes Codestück ist sehr schlechter Programmierstiel für Java: Variablen in einer Klasse NIE public machen (sondern über set/get Methoden). Der Grund: Mittels set/get hast du eine viel bessere Kontrolle, was mit deinen Variablen passiert, kannst überprüfen, ob eingegebene Werte gültig sind,...

MfG Bischi

peschmae
09-02-2008, 10:43
Naja, für eine Point-Klasse die drei Ints speichert... - das sehe ich dann doch etwas Pragmatischer.

Für einen einzelnen Int benutzt du ja auch keine get/set Methoden, oder? ;)

MfG Peschmä

dimevit
09-02-2008, 10:49
Hi,

ich hab auch mit Point point = new Point() probiert,
hatte auch nicht funktioniert, und Set/Get finde ich nicht so gut für nur 3 variablen,
ausserdem brache ich nur eine struct und keine richtige klassen und will keinen speicher verschwenden

jan61
09-02-2008, 23:58
Moin,


ich hab auch mit Point point = new Point() probiert, hatte auch nicht funktioniert,

vergiss nicht den Konstruktor des Vector, so wie es peschmae schon geschrieben hat. Ein per null-Zuweisung nicht initialisiertes Objekt kannst Du eben nicht verwenden.


und Set/Get finde ich nicht so gut für nur 3 variablen, ausserdem brache ich nur eine struct und keine richtige klassen und will keinen speicher verschwenden

Denke nicht in C, denke in Java und denke objektorientiert. Was ist, wenn Du die Point-Klasse später (z. B. für eine Klasse PointInCircle, die nur Punkt-Koordinaten innerhalb eines vorgegebenen Radius enthalten soll) als Basisklasse verwenden willst? Du kannst die Sichtbarkeit in abgeleiteten Klassen nicht wieder einschränken. Du verbaust Dir mit dieser Art von Programmierstil viele Möglichkeiten sinnvollen Code-Recyclings.

Just my 0.02

Jan

BlueJay
10-02-2008, 23:05
Du verbaust Dir mit dieser Art von Programmierstil viele Möglichkeiten sinnvollen Code-Recyclings.

Wenn sich das Konstrukt als praktisch erweisen sollte, hat man die getter/setter schnelle drin.

Ansonsten sollte man kein overkill betreiben, sonst gewinnt die Konkurrenz:

http://www.projectcartoon.com/cartoon/644

so long,
BlueJay

jan61
11-02-2008, 18:59
Moin,


Wenn sich das Konstrukt als praktisch erweisen sollte, hat man die getter/setter schnelle drin...

ja, und die public int's auch noch. Viel Spaß beim Refactoring.

Jan

peschmae
11-02-2008, 20:21
Ja, also nachträglich einbauen würde ich get/set-Methoden jetzt lieber auch nicht. Hab ich auch schon gemacht - gehört zu den langweiligsten Sachen die ich kenne ;)

Ich meine: Wenn man von Anfang an sicher ist dass man nicht später doch noch get/set möchte, einem die einfacherere Schreibweise wichtig ist und/oder die Performance extrem wichtig ist (kann bei einer Point-Klasse durchaus mal passieren; wenn man ein paar Millionen Punkte hat...), dann lässt man die Methoden besser sein. Sonst nicht.

Oder ihr benutzt einfach alle C++; da macht man ein inline davor und die Performance-Frage ist geklärt... :D

MfG Peschmä

BlueJay
12-02-2008, 07:49
ja, und die public int's auch noch.

So public sind die auch nicht. Ausserhalb des eigenen packages ist es mit Zugriff Sense, jedenfalls nach obiger Syntax.
Innerhalb der Bibliothek hat man dann noch was zum Geschwindigkeits-Optimieren, z.B. bei Sprites.

BlueJay
12-02-2008, 08:03
Oder ihr benutzt einfach alle C++; da macht man ein inline davor und die Performance-Frage ist geklärt... :D


... und wenn ihr euch dann gerade an die C++-Bibliotheken gewöhnt habt und endlich damit jonglieren könnt, werden die in der nächsten Version abgeschafft oder bis zur Unkenntlichkeit verunstaltet. :(

Aus diesem Grund verfolge ich interessiert den Werdegang des GCJ.

peschmae
12-02-2008, 11:33
Naja, selber schuld wenn du die falschen Bibliotheken verwendest - das ist ja nicht der Fehler von C++ :-p

GCJ habe ich schon lange abgeschrieben. ;)

MfG Peschmä

BlueJay
14-02-2008, 15:17
GCJ habe ich schon lange abgeschrieben. ;)

Warum? Kneifen die vorm AWT?

so long,
BlueJay

peschmae
14-02-2008, 17:20
Nun ja. Suns Java ist dank JIT halt schneller; oder wars zumindest als ichs getestet hab... ;)

Kommt natürlich auch sehr darauf an was genau man damit macht.

MfG Peschmä

BlueJay
15-02-2008, 17:44
Nun ja. Suns Java ist dank JIT halt schneller;

JIT ist sauschnell, steckt C++ in den Sack, aber erst nach so 20 - 40s Anlaufzeit. Meine stille Hoffnung war so ein AOT-Compiler, der einen ähnlich schnellen Code fabriziert, aber das eben von Anfang an.

peschmae
15-02-2008, 21:40
Das mit der Startzeit ist tatsächlich ein Problem und mit GCJ für die meisten Apps wohl auch besser (habs nicht mit wirklich vielen getestet). Aber der Rest... ;)

MfG Peschmä