1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Stack

  • alex_18
  • 29. Oktober 2006 um 11:14
  • Unerledigt
  • alex_18
    2
    alex_18
    Mitglied
    Punkte
    35
    Beiträge
    4
    • 29. Oktober 2006 um 11:14
    • #1

    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.

  • mdk
    26
    mdk
    Emeritus
    Reaktionen
    130
    Punkte
    7.120
    Beiträge
    1.390
    • 29. Oktober 2006 um 11:22
    • #2

    probiere einmal

    Code
    Stack<Integer> s = new Stack<Integer>();
  • alex_18
    2
    alex_18
    Mitglied
    Punkte
    35
    Beiträge
    4
    • 29. Oktober 2006 um 11:27
    • #3

    Jetzt funktioniert es.
    Danke

  • a9bejo
    21
    a9bejo
    Mitglied
    Reaktionen
    42
    Punkte
    4.697
    Beiträge
    913
    • 29. Oktober 2006 um 11:28
    • #4

    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.

    lg, Benjamin Ferrari, bookworm.at

  • florian.kisser
    2
    florian.kisser
    Mitglied
    Punkte
    20
    Beiträge
    4
    • 29. Oktober 2006 um 16:02
    • #5

    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?

  • beefy
    13
    beefy
    Mitglied
    Reaktionen
    18
    Punkte
    1.683
    Beiträge
    304
    • 29. Oktober 2006 um 16:27
    • #6
    Zitat von florian.kisser

    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...

  • florian.kisser
    2
    florian.kisser
    Mitglied
    Punkte
    20
    Beiträge
    4
    • 29. Oktober 2006 um 16:40
    • #7

    Garantiert kein überladener Konstruktor.

    Den Stack habe ich items getauft:

    Java
    import java.util.*;
    import java.lang.*;
    
    
    public class Upn {
        private Stack<Integer> items = new Stack<Integer>();    // Stack für die Operanden
        private int a, b;    // die beiden zu verarbeitenden Operanden - refresh() liefert neue Operanden
        public boolean stateOK = true;
    
    
        public boolean add() {    // Addition
            if (!refresh()) return false;
            push(a + b);
            return true;
        }
    
    
        public boolean sub() {    // Subtraktion
            if (!refresh()) return false;
            push(a - b);
            return true;
        }
    
    
        public boolean multi() {    // Multiplikation
            if (!refresh()) return false;
            push(a * b);
            return true;
        }
    
    
        public boolean div() {    // ganzzahlige Division
            if (!refresh()) return false;
            if (b!=0) {    // keine Division durch 0
                push(a / b);
                return true;
            } else {
                stateOK = false;
                return false;
            }
        }
    
    
        public void push(int item) {    // push-Wrapper für den Stack - wandelt int zu java.lang.Integer
            items.push(Integer.valueOf(item));
        }
    
    
        private boolean refresh() {    // liest neue Operanden aus
            try {
                b = items.pop().intValue();
                a = items.pop().intValue();
                return true;
            } catch(Exception e) {
                stateOK = false;
                return false;
            }
        }
    
    
        public String returnStack() {    // liefert den Stack bzw das Ergebnis als String
            String result = "";
    
    
            if (stateOK && !items.empty()) {
                result = items.pop().toString();
                while (!items.empty()) {
                    result = items.pop().toString() + " " + result;
                }
            }
            return result;
        }
    
    
        public void reset() {    // Zuruecksetzen (loescht den Stack und setzt den Status auf OK)
            items = new Stack<Integer>();
            stateOK = true;
        }
    
    
        public static void Upn() {    // Konstruktor
    
    
        }
    }
    Alles anzeigen

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

  • beefy
    13
    beefy
    Mitglied
    Reaktionen
    18
    Punkte
    1.683
    Beiträge
    304
    • 29. Oktober 2006 um 16:46
    • #8
    Zitat von florian.kisser
    Code
    public static void Upn() {    // Konstruktor
    }


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

    Code
    public Upn() {
    }
  • florian.kisser
    2
    florian.kisser
    Mitglied
    Punkte
    20
    Beiträge
    4
    • 29. Oktober 2006 um 17:12
    • #9
    Zitat von beefy

    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.

  • hssemichi
    1
    hssemichi
    Mitglied
    Punkte
    10
    Beiträge
    2
    • 30. Oktober 2006 um 02:21
    • #10

    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..

  • a9bejo
    21
    a9bejo
    Mitglied
    Reaktionen
    42
    Punkte
    4.697
    Beiträge
    913
    • 30. Oktober 2006 um 09:06
    • #11

    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.

    lg, Benjamin Ferrari, bookworm.at

  • florian.kisser
    2
    florian.kisser
    Mitglied
    Punkte
    20
    Beiträge
    4
    • 30. Oktober 2006 um 12:31
    • #12

    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.

  • Blutsturz
    12
    Blutsturz
    Mitglied
    Reaktionen
    21
    Punkte
    1.351
    Beiträge
    261
    • 10. November 2006 um 15:51
    • #13

    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!

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    Punkte
    11.122
    Beiträge
    2.208
    • 10. November 2006 um 16:11
    • #14

    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!

  • Vevusio
    6
    Vevusio
    Mitglied
    Reaktionen
    1
    Punkte
    371
    Beiträge
    71
    • 10. November 2006 um 21:34
    • #15

    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.

  • Maximilian Rupp 27. Dezember 2024 um 12:05

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung