PokéDex - ArrayList Problem

Wir sammeln alle Infos der Bonusepisode von Pokémon Karmesin und Purpur für euch!

Zu der Infoseite von „Die Mo-Mo-Manie“
  • Hey,


    ich würde gerne einen PokéDex programmieren, der sehr einfach gestaltet ist. Man hat 1 TextField (Name), 1 NumberField (Zahl) und ein TextField (Typ) und man soll dann aus einer ArrayList die Pokémon raus suchen können. Bloß da scheiter ich schon. Wenn ich die Suchfunktion benutze zeigt er mir nur an, dass MissingNo vorhanden ist, sobald ich ein anderes Pokémon suchen möchte sagt er immer, dass es nicht vorhanden war. Ich zeige euch einfach mal den Quellcode:


    Hier ist der Code für die ArrayList. Wird noch weitergeführt wenn es funktioniert:


    Code
    String[] pokemon = new String[152];{    pokemon[0] = "MissingNo";    pokemon[1] = "Bisasam";    pokemon[2] = "Bisaknosp";    pokemon[3] = "Bisaflor";    pokemon[4] = "Glumanda";    pokemon[5] = "Glutexo";  }int i;


    Und hier die Suchfunktion aus dem Button für den Namen des jeweiligen Pokémons:


    Code
    public void jButton1_ActionPerformed(ActionEvent evt) {
        // TODO hier Quelltext einfügen    
        if (pokemon[i].contains (jTextField1.getText())){  //Prüft ob das Pokémon vorhanden ist
          jLabel4.setText("Dieses Pokémon ist vorhanden.");
        }else{
          jLabel4.setText("Dieses Pokémon ist nicht vorhanden.");
        }
      } // end of jButton1_ActionPerformed


    Wäre echt super, wenn ihr mir da irgendwie helfen könntet, ich bin da leider echt am verzweifeln. :totumfall:


    Danke schonmal im vorraus!


    EDIT: Rechtschreibfehler behoben.

    :pika: Mein 3DS Freundescode: 2895 - 7146 - 5025 :pika:


    Suche Freunde für Pokémon Rumble Wolrd


    Abenteuerrang: 30


    Gefangene Arten: 229
    1. Partner: Palkia 1067 Palkia
    2. Partner: Xerneas 1058 Xerneas

  • Im ersten Codeschnipsel baust du ein Array, keine ArrayList. Arrays haben keine contains() Methode, ein Grund, dass der zweite Schnipsel nicht funktionieren kann.
    Eine ArrayList sähe so aus:

    Code
    ArrayList<String> pokemon = new ArrayList<String>(152); //die Größe ist hier keine Pflichtangabe, aber es tut auch nicht weh, wenn sie angegeben istpokemon.add("MissingNo");pokemon.add("Bisasam");...


    Die Initialisierung der Liste sollte in einer entsprechenden Initialisierungsfunktion stattfinden, auch wenn
    Ob ein bestimmtes Element enthalten ist, lässt sicht dann mittels

    Code
    pokemon.contains(value)


    prüfen.
    Willst du stattdessen mit dem Array arbeiten, musst du zum einen mittels Schleife durch die Elemente iterieren:


    Edit: Nur der Vollständigkeit halber: die .contains()-Methode funktioniert zwar auch auf Strings, dort ist sie aber nicht sinnvoll um zu prüfen, ob ein Pokemon vorhanden ist. Würde man "afl" eingeben, würde ein vorhandenes Pokemon erkannt werden, weil "Bisaflor" die entsprechende Sequenz enthält.

  • Erst einmal vielen Dank für die schnelle Hilfe! Ich weiß nun was ich falsch gemacht habe.
    Jetzt habe ich eine Fehlermeldung erhalten in der Liste, womit ich aber nicht wirklich etwas anfangen kann.
    Ich habe den Code in die Methoden über den ActionPerformed Teil geschrieben, vllt. ist er falsch platziert? Weiß nicht genau wohin damit.


    Hier ist einmal der neue Code und dann die Fehlermeldung:


    Code
    ArrayList<String> pokemon = new ArrayList<String>(152);
      pokemon.add("MissingNo");
      pokemon.add("Bisasam"); 
      pokemon.add("Bisaknosp");
      pokemon.add("Bisaflor");
      pokemon.add("Glumanda");
      pokemon.add("Glutexo");
    
      int i;


    Und hier die Fehlermeldung, der zeigt für jeden Eintrag die selben 2 Meldungen an, habe deswegen nur einen Eintrag + Fehlermeldung rauskopiert:


    Compiliere C:\Dokumente und Einstellungen\Olli\Desktop\PokeDex Projekt\PokeDex.java mit Java-Compiler
    PokeDex.java:104:14: error: <identifier> expected
    pokemon.add("MissingNo");
    ___________^
    PokeDex.java:104:15: error: illegal start of type
    pokemon.add("MissingNo");
    ____________^



    Danke schonmal wieder im vorraus!


    EDIT: habe die Häckchen dahin verschoben wo er mir den Fehler anzeigt, wurde grad weg formatiert leider. Also bei der aufgehenden Klammer und dann bei den Anführungszeichen.

    :pika: Mein 3DS Freundescode: 2895 - 7146 - 5025 :pika:


    Suche Freunde für Pokémon Rumble Wolrd


    Abenteuerrang: 30


    Gefangene Arten: 229
    1. Partner: Palkia 1067 Palkia
    2. Partner: Xerneas 1058 Xerneas

  • Wie ich bereits sagte, die Initialisierung der Liste gehört in eine entsprechende Funktion (der Einfachheit halber bietet sich hier wohl der Konstruktor an).
    Also beispielsweise so:

  • Mit dem Konstruktor hätte ich auch selbst drauf kommen können, es sind die kleinen Dinge im Leben die ich übersehe. Vielen Dank dafür!


    Trotzdem zeigt mein Compiler mir noch ein 2 Fehlermeldungen an. Ich kann mit den Meldungen leider nix anfangen. Habe den Code jetzt direkt unter der Basisklasse PokeDex eingefügt und trotzdem das hier:


    Code:


    Fehlermeldung:


    Compiliere C:\Dokumente und Einstellungen\Olli\Desktop\PokeDex Projekt\PokeDex.java mit Java-Compiler
    PokeDex.java:29:13: error: cannot find symbol
    private ArrayList<String> pokemon = null;
    ______^
    symbol: class ArrayList
    location: class PokeDex
    PokeDex.java:34:19: error: cannot find symbol
    pokemon = new ArrayList<String>();
    _____________^
    symbol: class ArrayList
    location: class PokeDex


    Danke schonmal!


    EDIT: Häckchen wieder verschoben.

    :pika: Mein 3DS Freundescode: 2895 - 7146 - 5025 :pika:


    Suche Freunde für Pokémon Rumble Wolrd


    Abenteuerrang: 30


    Gefangene Arten: 229
    1. Partner: Palkia 1067 Palkia
    2. Partner: Xerneas 1058 Xerneas

  • Ich fühl mich teilweise echt doof wenn ich so viele Fragen stelle. Das hat das Problem behoben, es wird keine Fehlermeldung mehr angezeigt für das Array!


    Habe jetzt mit der Suchfunktion die im ActionPerformed steht die Problematik.


    Code:


    Code
    public void jButton1_ActionPerformed(ActionEvent evt) {
        // TODO hier Quelltext einfügen
    for (int i = 0; i < pokemon.length; i++) {
        if (pokemon[i].equalsIgnoreCase(jTextField1())) {
          jLabel4.setText("Dieses Pokémon ist vorhanden.");
        }else{
          jLabel4.setText("Dieses Pokémon ist nicht vorhanden.");
        }
      }
    }


    Fehlermeldung:
    Compiliere C:\Dokumente und Einstellungen\Olli\Desktop\PokeDex Projekt\PokeDex.java mit Java-Compiler
    PokeDex.java:118:32: error: cannot find symbol
    for (int i = 0; i < pokemon.length; i++) {
    _____________________^
    symbol: variable length
    location: variable pokemon of type ArrayList<String>
    PokeDex.java:118:37: error: cannot find symbol


    if (pokemon[i].equalsIgnoreCase(jTextField1())) {
    ____________________________^
    symbol: method jTextField1()
    location: class PokeDex
    PokeDex.java:118:16: error: array required, but ArrayList<String> found


    if (pokemon[i].equalsIgnoreCase(jTextField1())) {
    __________^
    Note: PokeDex.java uses unchecked or unsafe operations.
    Note: Recompile with -Xlint:unchecked for details.


    Hoffe ihr könnt mir da noch ein letztes mal helfen. Danke !


    EDIT: Schleife vergessen miteinzufügen in den Code.

    :pika: Mein 3DS Freundescode: 2895 - 7146 - 5025 :pika:


    Suche Freunde für Pokémon Rumble Wolrd


    Abenteuerrang: 30


    Gefangene Arten: 229
    1. Partner: Palkia 1067 Palkia
    2. Partner: Xerneas 1058 Xerneas

  • Inzwischen nutzt du ja eine ArrayList. Dort ist die .contains()-Methode zu nutzen, da sie die in der Liste vorhandenen Elemente mittels .equals() mit dem Eingabewert vergleicht.
    Deine Code-Schnipsel sollte so aussehen:

    Code
    public void jButton1_ActionPerformed(ActionEvent evt) {
        // TODO hier Quelltext einfügen
        if (pokemon.contains(jTextField1.getText())) {
          jLabel4.setText("Dieses Pokémon ist vorhanden.");
        }else{
          jLabel4.setText("Dieses Pokémon ist nicht vorhanden.");
        }
      }
  • Das Programm lässt sich jetzt starten. Wenn ich dann aber Beispielsweise "Bisasam" in das jTextField1 eingebe und auf den jButton1 drücke passiert gar nix und mein Compiler zeigt mir diese Meldung an:


    Starte C:\Dokumente und Einstellungen\Olli\Desktop\PokeDex Projekt\PokeDex.java

    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at PokeDex.jButton1_ActionPerformed(PokeDex.java:118)
    at PokeDex$1.actionPerformed(PokeDex.java:82)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6505)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
    at java.awt.Component.processEvent(Component.java:6270)
    at java.awt.Container.processEvent(Container.java:2229)
    at java.awt.Component.dispatchEventImpl(Component.java:4861)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    at java.awt.Container.dispatchEventImpl(Container.java:2273)
    at java.awt.Window.dispatchEventImpl(Window.java:2719)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:694)
    at java.awt.EventQueue$3.run(EventQueue.java:692)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:708)
    at java.awt.EventQueue$4.run(EventQueue.java:706)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)


    Ich benutze Swing Container, also ich weiß nicht warum dort die ganze Zeit java.awt steht. Ich hoffe ihr könntet mir da nochmal aushelfen.


    Danke schonmal an alle die mir bis hier hin geholfen haben!

    :pika: Mein 3DS Freundescode: 2895 - 7146 - 5025 :pika:


    Suche Freunde für Pokémon Rumble Wolrd


    Abenteuerrang: 30


    Gefangene Arten: 229
    1. Partner: Palkia 1067 Palkia
    2. Partner: Xerneas 1058 Xerneas

  • Das hier hat nix damit zu tun oder?


    Code
    private ArrayList<String> pokemon = null;


    Steht aber auch nicht im ActionPerformed drin, sondern das hier:


    Code
    // Anfang Methoden   
      public void jButton1_ActionPerformed(ActionEvent evt) {
        // TODO hier Quelltext einfügen
        if (pokemon.contains(jTextField1.getText())) {
          jLabel4.setText("Dieses Pokémon ist vorhanden.");
        }else{
          jLabel4.setText("Dieses Pokémon ist nicht vorhanden.");
        }
      }// end of jButton1_ActionPerformed


    Habe da eig. nichts verändert, sondern das so übernommen, wie du mir empfohlen hast.


    Danke schonmal!

    :pika: Mein 3DS Freundescode: 2895 - 7146 - 5025 :pika:


    Suche Freunde für Pokémon Rumble Wolrd


    Abenteuerrang: 30


    Gefangene Arten: 229
    1. Partner: Palkia 1067 Palkia
    2. Partner: Xerneas 1058 Xerneas

  • Obs hilft, weiß ich nicht, aber füge mal im Konstruktor ganz am Anfang super(); ein. Falls das Problem dadurch nicht gelöst wird, kann ich mir später mal den Code nochmal anschauen. So in etwa:

    Code
    public PokeDex() {
     super();
        pokemon = new ArrayList<String>();
        pokemon.add("MissingNo");
        pokemon.add("Bisasam");
    ...
  • Leider funktioniert das nicht. Aber Danke für die Mühe! Ich schreib dir hier mal den ganzen Code rein, falls dir das weiterhilft. Ich kann dir auch gern nen Bild von dem Fenster schicken wenn du möchtest, also falls das hilft.



    Danke jedenfalls für deine Hilfe, hast mich auf jedenfall schon ein großes Stück weiter gebracht!

    :pika: Mein 3DS Freundescode: 2895 - 7146 - 5025 :pika:


    Suche Freunde für Pokémon Rumble Wolrd


    Abenteuerrang: 30


    Gefangene Arten: 229
    1. Partner: Palkia 1067 Palkia
    2. Partner: Xerneas 1058 Xerneas

  • Okay, nun ist natürlich klar, warums nicht geht. Es wird der zweite Konstruktor mit dem Titel verwendet, nicht der erste, in dem die ArrayList initialisiert wird.
    Spontan würde ich daher vorschlagen, dass du in Zeile 34 statt des Konstruktors eine Init-Methode nutzt. Ungefähr so:


    Darüber hinaus kompilliert man Java nicht :)


    Natürlich wird Java-Code kompiliert. Das merkt man oft nicht mehr, da IDEs wie Eclipse das im Hintergrund machen. Ausgeführt werden trotzdem nicht die .java-Dateien, sondern die kompilierten .class-Dateien.

  • Nein!
    Kompillieren ist das Übersetzen in die Systemsprache, das ist aber bei Java nicht der Fall, deswegen läuft Java auch Systemunabhängig.


    e/ okay, hab ein paar Begriffe durcheinander gebracht, man nennt es tatsächlich kompilieren, obwohl es das rein logisch eigentlich nicht ist

  • obwohl es das rein logisch eigentlich nicht ist


    Doch, ist es durchaus. Es gibt durchaus Maschinen, die in der Lage sind Bytecode direkt auszuführen und nicht, wie unsere haushaltsüblichen Rechner eine VM dafür benötigen. .net-Sprachen gehen ja inzwischen den Umweg über eine Laufzeitumgebung, der Code wird in eine eigene Sprache kompiliert und erst während der Ausführung in Maschinencode umgesetzt.
    Aber ich glaube, wir schweifen ab. ;D

  • Danke für die Mühe! Trotzdem schmeißt er noch diesen Text hier raus beim drücken des jButton1.
    Ja ich weiß, ich sollte denen Namen geben :D Wird auch noch gemacht!


    Hier der Code aus dem Compiler, ist fast der selbe wie vorhin:


    Starte C:\Dokumente und Einstellungen\Olli\Desktop\PokeDex Projekt\PokeDex.java


    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at PokeDex.jButton1_ActionPerformed(PokeDex.java:118)
    at PokeDex$1.actionPerformed(PokeDex.java:82)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6505)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
    at java.awt.Component.processEvent(Component.java:6270)
    at java.awt.Container.processEvent(Container.java:2229)
    at java.awt.Component.dispatchEventImpl(Component.java:4861)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    at java.awt.Container.dispatchEventImpl(Container.java:2273)


    Ich komm einfach nicht hinterher was ich falsch mache, ich will hinterher jedem Array noch eine Zahl und einen Typen zuordnen. Habe da jetzt schon Angst vor wenn ich nichtmal das hier hinbekomme. :verysad:

    :pika: Mein 3DS Freundescode: 2895 - 7146 - 5025 :pika:


    Suche Freunde für Pokémon Rumble Wolrd


    Abenteuerrang: 30


    Gefangene Arten: 229
    1. Partner: Palkia 1067 Palkia
    2. Partner: Xerneas 1058 Xerneas