static non-static

OK, wenn Blatt keine ERWEITERUNG von Stapel ist und ich somit kein extends benötige , woher weiß der Konstruktor überhaupt, dass Blatt ein besonderer Stapel ist.
Was muss der Konstruktor denn da wissen?

Ich würde Blatt und Stapel einfach trennen (wobei ja erstmal noch zu klären wäre, was Blatt sein soll), und zwischen den beiden keine Ist-Ein-Beziehubg aufbauen. Die führt nur zu Problemen (eins davon hast du ja schon gemerkt und mit protected „behoben“).
 
Ok,

ich hätte zum Speicher eine stack Liste nehmen sollen, aber gefordert war das Array,

Vorab: Ich vermute stark, dass das Problem bei "anzahl" liegt. Das ist die Variable, die anzeigt, welches die oberste Karte eines Stapels ist.

JEtzt habe ich ein anderes Problem.
Im Konfigurator werden die Spieler Konfigurationen aufgerufen, die wiederum die Stapelkonfiguratoren aufrufen die wiederum die Kartenkonfigurationen aufrufen.
Spieler [0] wir erstellt und bekommt die Variable "anzahlStartHandkarten". Mit der kann er selber nichts anfangen und reicht die weiter an den Stapel Konfigurator.

Code:
public Spieler(int anzahlStarthandKarten, Stapel blatt) {   
        // die Variable anzahlStarthandKarten wird direkt an den Stapelkonfigurator weitergeegeben.
        this.handkarten = new Stapel(anzahlStarthandKarten);
        System.out.println("Name des  Spielers?");
        Scanner Eingabe = new Scanner (System.in);
        name =  Eingabe.nextLine();
        //Jetzt werden die Handstapel gefüllt, dass kann der Stapelkonfigurator nicht machen, da nicht jeder Stapel gefüllt sein muss.
        handkarten.stapelFüllen(blatt);
    }
JEtzt werden die also gefüllt.
Jetzt hat der Stapel in der Variable die richtige Zahl ABER mit einer sysout-Anweisung , in der ich mir die Anzahl ausdrucken lasse , was auch funktioniert, gibt es hier den ersten Fehler
12413

Javascript:
    public void stapelFüllen(Stapel blatt) {
        //Hier kommt es zum ersten Fehler "java.lang.NullPointerException
        // Ich habe nachgeprüft, anzahl ist hier auf jeden Fall immer richtig!
        for (int i = 0; i < anzahl; i++) {
            System.out.println("Index i in stapelfüllen " +i );
            //Hier kann er Karte [0] nicht finden, (habe ich mir auch schonmal ausgeben lassen)
            //obwohl er SICHER 0 als index verwendet hat, das habe ich MEHRMALS überprüft!!! siehe oben!!
            karten[i].zeigen();
        }
    }
komischerweise macht er manchmal weiter, bis er hier landet:

Javascript:
public Karte getObersteKarte() {
        //Hier fängt er IMMER mit dem richtigen Index an.
        Karte obersteKarte = karten[(anzahl - 1)];
        System.out.println("hinter oberste KArte");
        System.out.println(obersteKarte.getFarbe());
        //Die nächse Zeile ist eigentlich überflüssig, da ich nur auf den Index verweise, wenn
        // oberste KArte haben will, aber ich will sie löschen. Das war zunächst meine Vermutung für Abstürze,
        // aber auch mit rauskommentieren ändert sicht nichts, scheint also kein großes Problem zu sein.
        karten[anzahl - 1] = null;
        System.out.println();
        //In der nächsten Zeile bleibt er häufig hängen?!?!?!
        anzahl = (anzahl - 1);
        return obersteKarte;
    }
Manchmal geht es aber sogar dann weiter, (das Programm hat sogar schon für zwei bis sechs Spieler alle Karten ausgeteilt, den Ablage und Nachziehstapel erstellt. Aber spätestens, wenn die oberste Karte vom Ablagestapel gezeigt werden soll, gibt es ein Problem mit anzahl.
anzahl ist der Verweis auf die oberste KArte.
Hier erscheint mir ein prinzipielles Problem.
Ich hoffe, ich habe es gut beschrieben.

Danke im Voraus.
 
Was muss der Konstruktor denn da wissen?

Ich würde Blatt und Stapel einfach trennen (wobei ja erstmal noch zu klären wäre, was Blatt sein soll), und zwischen den beiden keine Ist-Ein-Beziehubg aufbauen. Die führt nur zu Problemen (eins davon hast du ja schon gemerkt und mit protected „behoben“).
Doch, das finde ich gut.

Ich muss auch von Blatt Karten abheben und den Spielern geben, dafür könnte ich natürlich eine MEthode neu schreiben, da das nur zu BEginn vorkommt, werde ich auch machen, aber jetzt lese ich erstmal meiner Tochter vor. OK, ich brauche nur die Mehtode gibKArte, ja scheint Sinn zu machen.

Blatt wird aber anders "hergestellt" als Stapel, daher erscheint ein eigener Konstruktor auf jeden Fall sinnvoll.
 
Der Code und der Fehler passen nicht wirklich zusammen?

Laut Fehler wird in stapelFüllen getObersteKarte aufgerufen, in dem gezeigten Code passiert das nicht.


stapelFüllen versucht eine Karte auszugeben - existiert denn da überhaupt schon eine Karte in dem Array? (Falls du nicht im Konstruktor von Stapel welche anlegst nein).
 
Doch, das finde ich gut.

Ich muss auch von Blatt Karten abheben und den Spielern geben, dafür könnte ich natürlich eine MEthode neu schreiben, da das nur zu BEginn vorkommt, werde ich auch machen, aber jetzt lese ich erstmal meiner Tochter vor. OK, ich brauche nur die Mehtode gibKArte, ja scheint Sinn zu machen.

Blatt wird aber anders "hergestellt" als Stapel, daher erscheint ein eigener Konstruktor auf jeden Fall sinnvoll.
Auf welchen Teil meines Beitrags beziehst du dich damit, und willst du damit verteidigen, dass Blatt ein Stapel ist oder stimmst du mir zu, dass es Unsinn ist?



Jetzt irgendwo extends zu nutzen, wird nur zu Problemen führen (wird leider meist viel zu früh gelehrt...).

Selbst wenn du jetzt sagst, dass ein Blatt (von dem immer noch nicht geklärt ist, was es ist) ein Stapel ist - willst du in deinem Programm irgendwo ein Blatt nutzen, wo ein Stapel benötigt wird? Wenn Nein: Vererbung weg. (Und wenn Ja: könnte jeder Spieler statt Stapel also einfach ein Blatt bekommen?)

Ein eigener Konstruktor macht grundsätzlich in jeder Klasse sein, und sei es nur, um den default-Konstruktor zu verhindern - das ist aber völlig unabhängig davon, ob es irgendeine Vererbungsbeziehung gibt.
 
Mmhh, hatt schon zu viele ander Sachen auch geändert. Blatt hat jetzt nicht mehr mit Stapel zu tun. Jetzt habe ich allerdings die Methoden mischen und getObereKarte zweimal, einmal in Stapel und einmal in Blatt.
Obwohl ich nicht weiß, wo da der Fehler lag, funktioniert Konfiguration jetzt wunderbar. Jetzt muss ich allerdings den Rest des Blattes an den Nachziehstapel übergeben.
 
Also, doch nicht wunderbar

Javascript:
    public  Konfiguration (int anzahlSpieler){
        this.anzahlSpieler= anzahlSpieler;
        this.gewinner = -1;
        Blatt blatt = new Blatt();
        blatt.blattMischen();
        //Damit genug Karten zum Spielen da sind, wird jetzt berechnet, wie viele Karten jeder bekommen soll.
        int z =(int) Math.floor(32/(anzahlSpieler+2));
        anzahlStarthandKarten =Math.min(6,z);
        spielerrunde = new Spieler [anzahlSpieler];
        for (int i = 0 ;i< anzahlSpieler ; i++) {
            this.spielerrunde [i]  = new Spieler (anzahlStarthandKarten, blatt);
            System.out.println("Hier kommt der erste Fehler, aber es geht trotzdem weiter");
            spielerrunde [i].zeigeHandKarten();
        }
        nachZiehStapel.stapelFüllen(blatt);
        Stapel ablageStapel = new Stapel (32);
        ablageStapel.karteHinzufügen(nachZiehStapel.getObersteKarte ());
    }
12414

Javascript:
public void zeigeKarten() {
        System.out.println("Zahl der Handkarten:" +anzahl);
        for (int i = 0; i < anzahl-1; i++) {
            System.out.println("Karte :  " + i+ " jetzt kommt der Fehler");
            karten[i].zeigen();
        }
    }
Irgendwie füllt er karten[0] nicht
 
Ich bin weiter!!!!

Ich hatte die ZEILE 100% , sogar 1000%, eingefügt (k=k+1), aber die Heinzalmännchen haben sie wieder gelöscht.
Hat mich 4 Stunden gekostet!
In der Zeit hätte ich das ganze Programm neu schreiben können!
 
FERTIG!!

Wenn ich mal Lust habe baue ich ENUMS ein,
und baue ein GUI drum rum(mit den ActionListenern habe ich mich schon ganz schön rumgeärgert, insbseonder wie ich die Werte aus Ihnen rausbekomme, aber vielleicht klappt das ja mit dem jetzigen Wissen besser.)
Außerdem könnte man es mit stacks ausrüsten.
Andere Spiele implentieren.

JEtzt ist erstmal ruhe!
Es stehen auch noch andere Sachen an.
Vielen Dank für eure Geduld!
Danke
Norman
 
K

kneitzel

Mein Ratschläge wären:
a) (Wie schon einmal geschrieben) Tests. Wenn man Tests einmal geschrieben hat für einzelne Teile, dann kann man diese Teile ganz einfach testen. Und das Testen von kleinen Teilen ist deutlich effektiver und einfach als nur das große Ganze zu sehen.
(Und ehe wieder diese Auslassungen kommen von wegen "ganz einfach": Das bezieht sich auf das Testen. Das ist dann, wenn man die Tests hat, ganz einfach. Bei dem vorgeschlagenen Tests für Dumme ist das ein einfaches Anstarten einer main Methode und das kannst Du doch schon und das ist auch in Deinen Augen ganz einfach, oder etwa nicht?)
b) Eine Source Code Verwaltung macht auch Sinn. Dann kann man auf alte Stände zurückgreifen, so man z.B. etwas löscht, was man später dann doch wieder haben möchte ...
 
a) (Wie schon einmal geschrieben) Tests. Wenn man Tests einmal geschrieben hat für einzelne Teile, dann kann man diese Teile ganz einfach testen. Und das Testen von kleinen Teilen ist deutlich effektiver und einfach als nur das große Ganze zu sehen.
(Und ehe wieder diese Auslassungen kommen von wegen "ganz einfach": Das bezieht sich auf das Testen. Das ist dann, wenn man die Tests hat, ganz einfach. Bei dem vorgeschlagenen Tests für Dumme ist das ein einfaches Anstarten einer main Methode und das kannst Du doch schon und das ist auch in Deinen Augen ganz einfach, oder etwa nicht?)
Netbeans kann das und ich nehme an, Eclipse kann das auch: Tests automatisch erstellen. Die automatisierten Tests mußt du dann zwar noch mit Leben füllen, aber grundsätzlich bekommst du eine Idee davon, wie der Test aussehen soll. Das, was dein Testframework noch alles bietet, kann man wunderbar mit der Autocodevervollständigung erforschen.
Es gibt auf youtube bestimmt genug Videos, wo gezeigt wird wie das geht.
 
Ja DAnke,

normalerweise fange ich ja auch bei main an, da ich aber so einen tollen Plan hatte, wer was können soll muss ich ja erstmal Karte erstellen um mit Stapel zu arbeiten.
NA ja.
Die Methode hatte ja auch schon funktioniert, ich habe die Zeile nur durchs kommentieren wieder gelöscht.
Ja. immer zwischenspeichern ;-))

Auch mit den Test war ich sehr zufriedenAber zum Debugger:
An die ganzen Möglichkeiten in eclipse habe ich mich noch nicht gewöhnt (arbeite erste zwei Wochen mit java) .
Mir ist klar, dass man Debuggen kann und ich habe das auch schon gemacht. Man kann aber eclipse tausendfach individualisieren und eine Million Sachen einstellen, da ist es nicht einfach den Überblick zu behalten wenn man gleichzeitig, static, main, Enums und auch noch packages, utilities, ....... alles machen soll.
Ich habe den Debugger schon mehrmals verwendet und mir auch das Variablenfenster dabei angeschaut (manchmal verschwindet das bei Window-> ShowView, dann erscheint es einfach nicht.
Jetzt das PROBLEM: Benutzt man den Debugger in der Variablenansicht, dann werden auch immer die von Java implizierten Methoden alle mitangezeigt, und das sind im Falle eines NULL-Pointer Fehlers SEEEEEHR viele. Da verliert man die Lust, den Debugger zu benutzen. (Eintausenmal F5 drücken). Ich weiß aber nicht, wie das heißt, was ich ausschalten will, daher habe ich in jeder Zeile, die ich überprüfenswert fand ein Sysout eingesetzt. Ich weiß ja selber, dass das unprofessionell ist. ALSO: Was muss ich ausschalten, um wirklich nur MEIN Code zu debuggen, ansonsten kann ich den Debugger nicht benutzen.

An sich war ich mit meinem Programm ansonsten sehr zufrieden. Im NAchhinein war es am schwersten das mit den Methoden zu verstehen, weil ich halt nicht gemerkt habe, dass ich keine Konfiguratoren hatte, das hat die Logik unheimlich erschwert, weil es ja nicht so funktionierte, wie es hätte sollen.


Fraglich ist allerdings, ob ich mich so sehr reinfuchse, da ich nicht weiß, ob ich überhaupt nach den zwei Wochen weiter Java programmiere.
Zur Erläuterung: Ich gehöre zu einer Gruppe von Lehrer, die in 2 Jahen in Kursen mit einer Gesamtlänge von ca 6 bis 8 Wochen Vollzeit zum Informatiklehrer ausgebildet werden. Die Ausbildung finde ich zwar sehr schmalspur, aber sie ist gleichwertig zu jemandem , der 8 Semester Informatik studiert hat. Da muss halt alles ein wenig schneller gehen. Zum Glück ist der mathematische Teil nicht so schwer (habe ich schon Vorlesungen gehalten) und in Physik habe ich schon Halbaddierer und Volladdierer mit Transistoren mit den Schülern gebaut, gewisse Grundkentnisse sind also da.
ToDoListe:
1. Wie debugge ich ohne die implizierten Fenster
2. GUIs erstellen
3. Was sind packages und was weiß ich alles
3. ENUMS
4. Diese Sache mit den Test der einzelnen Methoden

Grüße
Norman
 
Da ich Eclipse nicht benutze gehe ich jetzt mal von Netbeans aus und setze vorraus, daß Eclipse sich hier äquivalent verhält:

Das mit den 10^x Methodenaufrufen, damit meinst du wahrscheinlich den Stacktrace. Den mußt du in der Regel nicht völlig durchgehen, es reicht, wenn du nach deinen eigenen Klassen suchst. Der Stacktrace zeigt dir an, wo der Fehler herkommt. Wenn du eine Nullpointer-Exception in einem ArrayList hast, dann wird die Exception irgendwo tief in den Eingeweiden der Java Standardbibliothek geworfen, diese Stelle versteckt sich irgendwo hinter mindestens zwei oder drei Klassen und einem Interface und zig internen privaten Methodenaufrufen. Daher ist der Trace so lang.

Aber eigentlich geht der Fehler von ganz weit oben aus, wo in deiner Klasse der problematische Aufruf herkam. Und an dieser Stelle hilft dir der Debugger: Ein Haltepunkt am Methodenanfang, und dann schrittweise, Zeile für Zeile, das Programm weiter durchgehen. Dabei kannst du dir die Werte aller Variablen anschauen und prüfen, ob da die Werte drinstehen, die du erwartest.
 
K

kneitzel

Also ich finde erst einmal gut, dass Du da eine solche Weiterbildung machst, aber die Ansprüche der AUsbildung bezüglich den "8 Semestern Informatik" kann ich nicht nachvollziehen.... Irgendwie haben wir in den 8 Semestern mehr Stoff gehabt, als man mal eben so in 6-8 Wochen durchziehen könnte :)

Generell ist es egal, was für eine Sprache du nimmst. Aber ich fürchte, dass Du eine Sprache doch so gut können musst, dass Du diese auch vermitteln kannst. Und wenn etwas bei einem Schüler nicht läuft, dann sollte man das doch überblicken und einordnen können... Ob dies nun Java ist oder irgend eine andere Sprache ist dabei erst einmal egal. Aber eine Beherrschung sollte da sein, so dass man selbst das machen kann, was ja von den Schülern dann auch verlangt wird....

IDEs gibt es viele. Eclipse ist nicht bekannt für eine einfache, intuitive Bedienung. Daher wäre meine Empfehlung, sich einmal andere IDEs anzusehen. Hier ist z.B. auch zu beachten, was für Anforderungen es speziell aus Schulsicht gibt. IntelliJ finde ich sehr gut und das setze ich ein. Die Community Edition ist frei und für Schul-Belange mehr wie ausreichend. (JEE wird da wohl kaum Thema werden.) Zum Lernen gedacht ist z.B. auch BlueJ. Es gibt sehr viele Möglichkeiten und man sollte sich eine suchen, mit der man gut klar kommt, also da dann ruhig einmal andere IDEs ausprobieren.

Im Debugger reicht es in der Regel, den eigenen Code zu debuggen. Also nicht erst bei einer Exception reagieren, sondern vorher schon Schritt für Schritt durch den eigenen Code zu gehen. Aber bezüglich Debugger ist auch anzumerken, dass dieser überbewertet ist. Die Zeit, die ich im Debugger bin, ist extrem klein. Durch die Aufteilung in kleine Teile und die direkten Tests dieser Teile ist der Einsatz eines Debuggers oft unnötig. Der Griff zum Debugger ist da dann meist ein Zeichen, dass man da noch zu komplexe Teile hat mit zu wenig oder zu schlechten Tests.

Und generell ist die Frage, was den Schülern vermittelt werden soll. Was steckt da in den Lehrplänen alles drin?
==> Das sollte man sich im Detail gut aneignen. Wie will man etwas vernünftig vermitteln, wenn einem selbst das Verständnis fehlt?
 
Jo, wo stelle ich ein, dass ich nur MEINEN Code debugge.
Ich sehe das mit der Fortbidlung ähnlich, aber das Kultusministerium meint, dass das ausreichend ist.
Meine jüngste Tochter erhält ihren Matheunterricht in der 5. KLasse gerade von einer Zahnarzthelferin, so viel dazu.

Grüße
Norman
 
Jo, wo stelle ich ein, dass ich nur MEINEN Code debugge.
Gar nicht. Denn der von dir verwedete Code gehört ja genauso zu deinem Programm. Du mußt ja aber nicht die Bibliotheken mitdebuggen, es reicht doch wenn du durch deine eigenen Codezeilen tippelst.


Meine jüngste Tochter erhält ihren Matheunterricht in der 5. KLasse gerade von einer Zahnarzthelferin, so viel dazu.
Langsam wird es Zeit die Koffer zu packen. Diesem Land ist nicht mehr zu helfen... :mad:
 
Zuletzt bearbeitet:
Benutzt man den Debugger in der Variablenansicht, dann werden auch immer die von Java implizierten Methoden alle mitangezeigt, und das sind im Falle eines NULL-Pointer Fehlers SEEEEEHR viele. Da verliert man die Lust, den Debugger zu benutzen. (Eintausenmal F5 drücken).
Neben Step Into (F5) gibt es auch Step Over womit du zu nächsten Zeile springst und nicht in die aufgerufene Funktion. Das wird wahrscheinlich genau das sein was du suchst. Kann es gerade nicht ausprobieren aber ich tippe mal auf F6. Weiterhin gibt es auch noch Step Return womit du in der Aufrufhirarchie wieder eine Stufe nach oben kommst. Im Zweifelsfall schau dir einfach mal die Buttons oben im Debugger an...
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben