• Also ich hab ein paar Fragen zu dem Stack in Java, hoffe mir kann da jemand weiterhelfen.

    Zuerst habe ich ein Objekt und eine int-Variable erstellt:

    Code
    Stack s = new Stack();
    int x = 3;

    Wenn ich folgende Anweisung ausführe, kommt immer eine Warnung:

    Code
    s.push(x);


    warning: [unchecked] unchecked call to push(E) as a member of the raw type java.util.Stack

    Funktionieren tut es trotzdem, aber bei folgender Anweisung kommt eine Fehlermeldung:

    Code
    int y = s.pop();

    Test.java:12: inconvertible types
    found : java.lang.Object
    required: int

    Was kann ich mache, damit Integer-Werte zurückgegeben werden?

    Hoffe ihr könnt mir weiterhelfen, und danke schon im vorraus.

  • Hallo Alex,

    Dein Problem hat nichts mit der Klasse Stack zu tun, sondern mit den themen "Java Generics", "java primitive types" und "java autoboxing".

    Das sind Themen, in die du dich einlesen musst (sollte in jedem guten Java buch erklaehrt werden, oder du suchst nach den obigen Begriffen in der Suchmaschine deiner Wahl).

    Kurz gesagt: Bei der Zeile

    stack.push(x);

    wurde das primitive object x automatisch in ein Object der Klasse Integer umgewandelt. Datenstrukturen wie der Stack sind nicht in der lage, primitive Datentypen zu fassen.

    Und in der Zeile

    Stack stack = new Stack();

    hast du nicht angegeben, von welchen Typ die Objekte sind, die der Stack enthalten soll.

    Stack<Integer> stack = new Stack<Integer>();

    loest dieses Problem hier.

  • Hab gerade eine total komische Erfahrung gemacht, die ich mir absolut nicht erklären kann:
    Wenn ich zuerst den Stack deklariere

    Code
    private Stack<Integer> stack;


    und das Objekt dann im Konstruktor erzeuge

    Code
    stack = new Stack<Integer>();


    dann kann ich mittels push() hinzufügen was ich möchte, er wirft immer eine NullPointerException.
    Wenn ich allerdings gleich bei der Deklaration schreibe

    Code
    private Stack<Integer> stack = new Stack<Integer>();


    führt er alles so aus wie erwartet. Kann sich das irgendjemand erklären?

  • Hab gerade eine total komische Erfahrung gemacht, die ich mir absolut nicht erklären kann:
    Wenn ich zuerst den Stack deklariere

    Code
    private Stack<Integer> stack;


    und das Objekt dann im Konstruktor erzeuge

    Code
    stack = new Stack<Integer>();


    dann kann ich mittels push() hinzufügen was ich möchte, er wirft immer eine NullPointerException.
    Wenn ich allerdings gleich bei der Deklaration schreibe

    Code
    private Stack<Integer> stack = new Stack<Integer>();


    führt er alles so aus wie erwartet. Kann sich das irgendjemand erklären?


    Vielleicht hast du 2 Konstruktoren und rufst unabsichtlich den anderen auf, in dem stack nicht initialisiert wird? Zeig uns am besten den Code...

  • Garantiert kein überladener Konstruktor.

    Den Stack habe ich items getauft:

    So funktionierts, aber probier mal meine kleine Änderung wie beschrieben.

  • Das ist halt aber auch kein Konstruktor. :) Richtig wäre:

    Code
    public Upn() {
    }

    Ups.
    Hab vorm postn noch herumprobiert und vergessen das static rückgängig zu machen, aber das void is schon die ganze Zeit da. :shinner: Shame on me, n dummer Fehler. Hab hundermal hingeschaut und es übersehen.

  • frage: wieso schmeisst du in der memberfunction 'reset' den alten stack weg und allokierst einen neuen speicherbereich?

    Code
    public void reset() {    // Zuruecksetzen (loescht den Stack und setzt den Status auf OK)
            items = new Stack<Integer>();
            stateOK = true;
        }


    angenehmer waers doch, wenn du den stack mit .clear() leeren wuerdest, um ihn in den anfangszustand zu versetzen.

    Code
    public void reset() {    // Zuruecksetzen (loescht den Stack und setzt den Status auf OK)
            items.clear();
            stateOK = true;
        }


    daraus koennte naemlich deine exception resultieren (2 methoden, 2x selber speicher angefordert - garbage collector gibt w.o.).

    as if i would care..

  • Also fuer den fehler ist

    Code
    stack = new Stack<Integer>()

    nicht zustaendig, denn den haben wir ja mittlerweile gefunden und beseitigt. Es kann auch nicht zu problemen fuehren, wenn man einfach einen neuen stack erstellt.

    stack.clear() ist aber der schoenere weg, da hatt hssemichi schon recht.

  • Der Fehler is, dass der Konstruktor falsch deklariert war und deshalb nicht aufgerufen worden ist => der Stack war ein null-Objekt => NullPointerException

    wegen reset:
    Hab eine passende Stack-Funktion gesucht und nicht gefunden. Hab aber übersehen, dass clear vom Vektor vererbt wurde. Außerdem brauche ich reset garnicht; habs einfach nur so geschrieben.

  • Ich habe hier ein seltsames Problem, ich definiere den Stack in der UPN Klasse

    Code
    Stack<Integer> st = new Stack<Integer>();

    jedoch beim Kompilieren erhalte ich folgende Meldung:

    Code
    UPN.java:6: cannot find symbol
    symbol  : class Stack
    location: class UPN
                    Stack<Integer> st = new Stack<Integer>();

    jemand nen plan wo da der fehler liegen könnte?

    "There's no such thing as Computer Science-it's witchcraft", math department of MIT, 1961

    You are all children of a worthless god!

  • import vergessen?

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • du musst um stack zu benutzen java.util.Stack; oder sowas importieren

    [FONT=Arial, Helvetica, sans-serif](\__/) [/FONT]
    [FONT=Arial, Helvetica, sans-serif] (='.'=) [/FONT]This is Bunny. Copy Bunny into your signature to help
    [FONT=Arial, Helvetica, sans-serif](")_(")[/FONT] him on his way to world domination.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!