PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem: Nullpointerexecption



Reaper
06-05-2005, 17:57
Sorry aber mir ist erstmal kein besserer Threadtitel eingefallen und zweitens ist das Problem wohl eh ganz leicht zu lösen:
Ich hab 2 Javaklassen, die eine erbst von der andren. die Oberklasse hat aber gleichzeitig ein ArrayObjekt der Unterklasse als Bestandteil.

Hier mal der Code:

package blatt3aufgabe3;

public class Publikation extends Projekt {

public String Titel, Inhalt, Datum;
public Autor[] autor;

/** Creates a new instance of Publikation */
public Publikation(){}


public Publikation(String titel, String inhalt, String datum) {
this.Titel = titel; this.Inhalt = inhalt; this.Datum = datum;
}

public Publikation(String titel, String inhalt) {
this.Titel = titel; this.Inhalt = inhalt;
}

public Publikation(String titel) {
this.Titel = titel;
}

public static void main(String[] args) {
Publikation pub = new Publikation("Saudummertitel", "blablabla", "31.02.2005");
pub.autor[0] = new Autor("Nachname", "Vorname", "1.1.1111");
}
}



Und die Unterklasse davon:


package blatt3aufgabe3;

/**
*
* @author martin
*/
public class Autor extends Publikation {

public String Name, Vorname, Geburtsdatum;

/** Creates a new instance of Autor */

public Autor(String name, String vorname, String geburtsdatum) {
super();
this.Name = name;
this.Vorname = vorname;
this.Geburtsdatum = geburtsdatum;
}

public String toString() {
return new String("Name: "+this.Name+" Vorname: "+this.Vorname+" Geburtsdatum: "+this.Geburtsdatum);
}

}

Wenn ich das ganze aber jetz versuche laufen zu lassen erhalte ich immer:
Exception in thread "main" java.lang.NullPointerException
at blatt3aufgabe3.Publikation.main(Publikation.java:4 1)
Java Result: 1
Das ist die zeile mit pub.autor[0] = ....

Wen nich das Array weglasse und ein einzelnes Objekt nehme würde es gehen...
Was hab ich falsch gemacht?

anda_skoa
06-05-2005, 19:39
Wen nich das Array weglasse und ein einzelnes Objekt nehme würde es gehen...
Was hab ich falsch gemacht?

Das Array gibt es noch nicht :)

D.h. es fehlt ein


new Autor[anzahl];


Übrigens solltest du vielleicht nochmal über deine Ableitungshierachie nachdenken, ein Autor ist normalerweise keine Publikation :)

Ciao,
_

peschmae
06-05-2005, 19:44
Du musst erst ein Array der gewünschten Grösse anlegen.
public Autor[] autor; ist nur erst eine Referenz (auch Pointer genannt falls dir das mehr sagt) - da ist noch kein Speicher reserviert für das Ding. Das musst du erst noch selber machen wie hier (http://java.sun.com/docs/books/tutorial/java/data/arraybasics.html)

Hmm, zweiter.

MfG Peschmä

Reaper
06-05-2005, 21:07
Hmm OK. Pointer sagt mir was ;) Hab an menchen Stellen nur etwas schwierigkeiten mit Java und der Objektorientierung... schon ewig nimmer gemacht.
Aber da gehört eigentlich noch ein Array hinzu, das soll eine unendliche Größe haben, wie geht dann das?

Die Hierarchie ist so gedacht weil eine Publikation mehrere Autoren hat.
Soll die Implementierung eines UML Diagrams sein (langweiles info grundstudium zeug...): Autor (1 bis5) arbeitet an Publikation, Publ. referiert auf Publ. und Publ. gehört zu 1 Projekt.

Hat jmd ne andre Idee wie man sowas aufbauen sollte?

peschmae
06-05-2005, 21:59
Aber da gehört eigentlich noch ein Array hinzu, das soll eine unendliche Größe haben, wie geht dann das?


Nö, nix da unendlich, das gibts nur in Mathematik. Ausser unendlich doof (nee, ich meine nicht dich ;))

Arrays haben eine fixe Grösse die du am Anfang beim erstellen angeben musst. Container mit veränderbarer Grösse (quasi Unendlich falls du etwa 2*Unendlich viel Arbeitsspeicher hast) wäre z.B. die ArrayList
Die verwendet intern Arrays und kopiert die Inhalte in ein neu angelegtes, grösseres um, wenn der Platz nicht mehr ausreicht.

MfG Peschmä

anda_skoa
06-05-2005, 23:13
Die Hierarchie ist so gedacht weil eine Publikation mehrere Autoren hat.

Das ist ja schön und gut, aber warum sollte ein Autor eine Publikation sein.
Normalerweise sind Autoren Personen oder vielleicht noch Institutionen.

Die Idee, dass ein Autor die Publikation seiner Eltern ist, dehnt den Begriff Publikation schon ziemlich.

Ich hätte eher vermutete, daß ein Autor mehrere Publikationen haben kann, bzw. eine Publikation mehrere Autoren.

Aber vielleicht steckt dahinter ja noch eine höherer Idee, die mir nicht zugänglich ist?

Ciao,
_

Reaper
06-05-2005, 23:14
Ich werd das Array vollstopfen bis /dev/urandom keine Zeichen mehr hergibt ;)
OK ich glaub ArrayList hab ich überlesen in meinem JAva Buch... kommt davon.
In C ging das doch mit nem normalen Array wie PHP wenn ich mich richtig erinnere.
Hab grad die Lösungen von der spaßigen Aufgabe gesehen... Vector...
Aber war trotzdem gut zu Wissen.

@anda_skoa: Ja war so gedacht daß eine Publikation mehrere Autoren haben soll. Das extends ist hier irgendwie echt total überflüssig, eine Klassenvariable sollte reichen.

peschmae
07-05-2005, 05:23
In C ging das doch mit nem normalen Array wie PHP wenn ich mich richtig erinnere.

Jein. In C kannst du die grösse von Arrays auch nicht ändern - eher sogar noch etwas weniger als bei Java (muss zur kompilierzeit konstant sein - zumindest bei statischen-globalen Arrays sogar noch bei C99 blabla ;))

Aber wenn du den Speicherplatz mit malloc anforderst kannst du das dann natürlich mit realloc vergrössern/verkleinern (am Ende).



Hab grad die Lösungen von der spaßigen Aufgabe gesehen... Vector...
Aber war trotzdem gut zu Wissen.


Vector ist auch ok. Macht dasselbe wie ArrayList - letztere ist nur etwas moderner (und implementiert das List-Interface, d.h. man kann sie einfach gegen eine LinkedList austauschen (wobei die fast immer langsamer ist - lohnt sich also nicht das zu machen)).

Vector ist mittlerweile intern via eine ArrayList implementiert - also eigentlich overhead da das Ding zu benutzen und nicht direkt die ArrayList. Aber das ist ein Detail ;-)

MfG Peschmä

anda_skoa
07-05-2005, 10:59
Soweit ich weiß ist der wesentliche Unterschied zwischen Vector und ArrayList, daß die Methoden des Vector synchronized sind.




Das extends ist hier irgendwie echt total überflüssig, eine Klassenvariable sollte reichen.

Seh ich auch so.
Ableitung kann im ersten Augenblick einfach praktisch aussehen, aber ist dann fast immer zu einem späteren Zeitpunkt problematisch.
Auch wenn das Projekt keine wichtige Sache ist, sollte man sich erst gar nicht angewöhnen so zu arbeiten :)

Ciao,
_

Reaper
07-05-2005, 11:55
Was soll synchronized heißen?

Hat die ArrayList dann irgendwelche Nachteile gegenüber Array, wenn man auch ein festes Array hernehmen könnte (außer daß es keine primitiven Datentypen aufnehmen kann)?

anda_skoa
07-05-2005, 12:19
Was soll synchronized heißen?

Das heißt, daß mehrere Threads mit dem Container arbeiten können, ohne ihn durcheinander zu bringen.
D.h. aber auch, daß dabei zusätzlicher Overhead entsteht.
Darum macht es ArrayList auch nicht mehr selbst.



Hat die ArrayList dann irgendwelche Nachteile gegenüber Array, wenn man auch ein festes Array hernehmen könnte (außer daß es keine primitiven Datentypen aufnehmen kann)?

Durch die zusätzliche Indirektion (Methodenaufruf) wird es langsamer, aber ich schätze das fällt erst bei sehr vielen Zugriffen auf.

Ciao,
_

peschmae
07-05-2005, 14:00
Soviel ich weiss ist synchronized in jedem Fall erheblich langsamer (Faktor 10 habe ich so im Kopf) auch wenn du gar nicht mit Threads arbeitest.

MfG Peschmä

Reaper
07-05-2005, 14:02
Gut Danke.
(Bestätigt meine Vermutung daß unser Prof. eigentlich in Java gar nicht fit ist... komplizierte umständliche Lösungen für einfache Sachen...)

Achja noch was: ist es eigentlich sinnvoll get/set Methoden zu machen? Wenn man die Variable direkt ändern kann und keine Seiteneffekte auftreten sollen dann doch wohl nicht oder?

peschmae
07-05-2005, 14:07
Achja noch was: ist es eigentlich sinnvoll get/set Methoden zu machen? Wenn man die Variable direkt ändern kann und keine Seiteneffekte auftreten sollen dann doch wohl nicht oder?

Naja, wenn die Dinger eh public sind ists recht sinnlos. Aber generell würde ich schon get/set Methoden einer public-Membervariable bevorzugen.
u.A. wegen der dort möglichen Sinnkontrollen von Methodenaufrufen (und wegen der Konsistenz halt dann auch für Variablen bei denen du keine Kontrollen machst/machen kannst)

MfG Peschmä

Reaper
11-05-2005, 09:39
Ich hoff ich nerv jetzt nicht zu sehr aber hab da noch ne Frage dazu:

Wenn ich in eine ArrayListe jetzt beliebige Objekte Packe wie kann ich dann z.B. eine Liste aller Attribe "Name" dieser Objekte bekommen? Also es sind keine Strings, das wäre ja kein Großes Ding. Ich bekomm hier beim aufruf toString() oder direkt ausgegeben immer nur Objekt@Speicheradresse oder sowas in der Art.

anda_skoa
11-05-2005, 13:50
Einfach beim Drüberiterieren auf die tatsächliche Klasse casten.

Bei toString() würde es reichen, diese Methode in deiner Elementklasse zu überschreiben, aber vielleicht willst du noch andere Methoden aufrufen.

Ciao,
_