ServerPlugin ArrayList ArrayIndexOutOfBoundsException: 1

Dieses Thema im Forum "Programmierung" wurde erstellt von Disk, 19. März 2015.

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. Disk
    Offline

    Disk

    Registriert seit:
    20. September 2014
    Beiträge:
    29
    Hallo,

    ich bin gerade dabei ein MapVoting Plugin zu programmieren. Soweit bin ich fertig habe nur noch eine Fehlermeldung welche ich nicht weg bekomme. Hat da irgendjemand eine Idee?

    Hier der Code:
    Code (Text):
    1.  
    2. package me.Disk4.MapVoting;
    3.  
    4. import java.util.ArrayList;
    5. import java.util.HashMap;
    6.  
    7. import org.bukkit.Bukkit;
    8. import org.bukkit.command.Command;
    9. import org.bukkit.command.CommandSender;
    10. import org.bukkit.entity.Player;
    11. import org.bukkit.event.Listener;
    12. import org.bukkit.plugin.java.JavaPlugin;
    13.  
    14. public class Main extends JavaPlugin implements Listener {
    15.  
    16.  
    17.    public ArrayList<String> voted = new ArrayList<>();
    18.    public HashMap<String, Integer> votes = new HashMap<>();
    19.  
    20.    public ArrayList<String> arenas = new ArrayList<>();
    21.  
    22.  
    23.    public void onEnbable() {
    24.    
    25.      arenas.add("arena0");
    26.      arenas.add("arena1");
    27.      arenas.add("arena2");
    28.      arenas.add("arena3");
    29.      arenas.add("arena4");
    30.    
    31.    
    32.      for(String all : arenas) {
    33.        votes.put(all, 0);
    34.      }
    35.    }
    36.  
    37.  
    38.    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
    39.     {
    40.     if ((sender instanceof Player)) {
    41.        Player p = (Player) sender;
    42.        if(label.equalsIgnoreCase("result")) {
    43.          getResult();
    44.        }
    45.        if(label.equalsIgnoreCase("list")) {
    46.          getList(p);
    47.        }
    48.        if(label.equalsIgnoreCase("vote")) {
    49.          if(!voted.contains(p.getName())) {
    50.          if(arenas.contains(args[1].toLowerCase())) {
    51.          
    52.            int voteint = votes.get(args[1].toLowerCase());
    53.            voteint++;
    54.            votes.put(args[1].toLowerCase(), voteint);
    55.          
    56.            p.sendMessage("Du hast für " + args[1] + " gevotet");
    57.            p.sendMessage("Diese Map hat nun " + votes.get(args[1].toLowerCase()) + " votes");
    58.            voted.add(p.getName());
    59.          }else{
    60.            p.sendMessage("Diese Map gibt es nicht!");
    61.          }
    62.        }else{
    63.          p.sendMessage("Du hast bereits für eine Map gevotet!");
    64.        }
    65.      
    66.     }
    67.     }
    68.     return false;
    69.     }
    70.  
    71.    public void getList(Player p) {
    72.      for(String all : arenas) {
    73.        p.sendMessage(all + votes.get(all));
    74.      }
    75.    }
    76.  
    77.    public void getResult() {
    78.      int max = 0;
    79.      for(int i : votes.values()) {
    80.        if(i > max) {
    81.          max = i;
    82.        }
    83.      }
    84.    
    85.      String winner = "";
    86.    
    87.      for(String all : votes.keySet()) {
    88.        if(votes.get(all) == max) {
    89.          winner = all;
    90.        }
    91.      }
    92.    
    93.      Bukkit.broadcastMessage("Map " + winner + " hat da Mapvoting gewonnen!");
    94.    }
    95.  
    96. }
    97.  
    98.  
    Und hier die Fehlermeldung:
    Ich hoffe einer von euch kann mir helfen. Ich habe es gestern und heute schon einige Stunden versucht zu lösen aber bekomme es irgendwie nicht hin...

    LG Disk
     
    #1
  2. Max98LP
    Offline

    Max98LP

    Registriert seit:
    13. Januar 2013
    Beiträge:
    22
    Ort:
    /home/Max98LP
    Minecraft:
    Max98LP
    Bitte ändere mal dein "args[1]" überall zu "args[0]".
    Denn es wird ja bei 0 angefangen die Argumente zu zählen.
    Am besten wäre es wenn du noch überprüfst ob überhaupt ein Argument angegeben wurde:
    Code (Text):
    1. if(args.length == 0){
    2.     sender.sendMessage("Bitte geben sie mindestens 1 Argument an");
    3.     return true;
    4. }
     
    #2
  3. Disk
    Offline

    Disk

    Registriert seit:
    20. September 2014
    Beiträge:
    29
    Ich möchte doch nicht args[0] abfragen sondern args[1] da der Befehl ja z.b. /vote Map lautet und ich dann ja mit "Map" Sachen abfrage und nicht mit vote und der Error liegt bei der ArrayList und nicht bei den Befehl ansich und auch die Abfrage mit args.length hat damit nichts zu tun. Mir geht es hier nur um die funktionsweise des MapVotings und nicht um den Befehl selbst.

    LG Disk
     
    #3
  4. MrGoms
    Offline

    MrGoms

    Registriert seit:
    11. März 2015
    Beiträge:
    46
    Daran merkt man sofort, dass du keine grundlegenden Kenntnisse von Java hast!

    /vote Map yes
    Vote = Command
    Map = args[0]
    yes = args[1]

    In Java (und auch anderen Programmiersprachen) fängt man bei 0 an zu zählen.
    Ob das deinen Error behebt, sei mal dahin gestellt, da ich mir den Code noch nicht angeschaut habe, dennoch wäre das schon mal ein Anfang.

    Fazit: Lerne erstmal Java bevor du mit der Bukkit API anfängst ;)

    Viele Grüße
    MrGoms
     
    #4
  5. Disk
    Offline

    Disk

    Registriert seit:
    20. September 2014
    Beiträge:
    29
    aso, okey danke hab das jetzt geändert. Den Befehl erkennt es jetzt, nur er kommt nicht an der Abfrage ob diese Map in der ArrayList ist "vorbei" (Code: "if(arenas.contains(args[0].toLowerCase())) {...}") also es zeigt mir immer an, dass es diese Map nicht gibt (keine Fehlermeldungen)

    LG Disk :)
     
    #5
  6. MrGoms
    Offline

    MrGoms

    Registriert seit:
    11. März 2015
    Beiträge:
    46
    Schicke uns mal den verbesserten Code, vielleicht ist ja dennoch ein Fehler drinnen ;)
    Und nutze dieses Mal bitte http://hastebin.com/

    Viele Grüße
    MrGoms
     
    #6
  7. Disk
    Offline

    Disk

    Registriert seit:
    20. September 2014
    Beiträge:
    29
    ist der selbe nur mit args[0]
     
    #7
  8. MrGoms
    Offline

    MrGoms

    Registriert seit:
    11. März 2015
    Beiträge:
    46
    Nicht gerade übersichtlich, aber egal.

    Wenn ich nicht gerade irgendetwas übersehen haben sollte, sollte der Code eigentlich funktionieren.

    Code (Text):
    1.  
    2. if(arenas.comtains(args[0].toLowerCase()))
    3. {
    4.     p.sendMessage("Erfolgreich abgestimmt");
    5.     (...)
    6.  
    7. }
    8. else
    9. {
    10.     p.sendMessage("Arena nicht vorhanden!");
    11. }
     
    #8
  9. Disk
    Offline

    Disk

    Registriert seit:
    20. September 2014
    Beiträge:
    29
    Das macht er ja eben nicht ;)

    Hier nochmal auf hastebin: http://hastebin.com/sepemacepe.avrasm

    ps. Debug 1 wird ausgegeben Debug 2 nicht
     
    #9
  10. JTK222
    Offline

    JTK222

    Registriert seit:
    5. September 2013
    Beiträge:
    665
    Ort:
    Planet Erde
    Minecraft:
    JTK222
    Ich will ja nichts sagen aber:
    Code (Text):
    1. public ArrayList<String> arenas = new ArrayList<>();
    solltest du mal mit
    Code (Text):
    1. public ArrayList<String> arenas = new ArrayList<String>();
    austauschen
     
    #10
  11. MrGoms
    Offline

    MrGoms

    Registriert seit:
    11. März 2015
    Beiträge:
    46
    Code (Text):
    1.  
    2. public boolean onCommand(CommandSender sender, Command cmd, String cmdLabel, String[] args)
    3. {
    4.     if(sender instanceof Player)
    5.     {
    6.         Player p = (Player sender);
    7.         if(cmd.getName().equalsIgnoreCase("Vote"))
    8.         {
    9.              if(args.lenght == 1)
    10.              {
    11.                  if(arenas.contains(args[0].toLowerCase()))
    12.                  {
    13.                      p.sendMessage("Erfolgreich abgestimmt");
    14.                  }
    15.                  else
    16.                  {
    17.                      p.sendMessage("Arena nicht vorhanden!");
    18.                  }
    19.              }
    20.         }
    21.     }
    22. }
    23.  
    24.  
    @JTK222
    Total übersehen *pfeif*

    Teste das mal, die Abfrage, ob der Spieler bereits gevoted hat, habe ich mir jetzt auf die Schnelle geschenkt ;)

    Grüße
    MrGoms
     
    #11
  12. Disk
    Offline

    Disk

    Registriert seit:
    20. September 2014
    Beiträge:
    29
    Was soll das bringen? Ich habe es noch nie in einen Plugin mit "<String>" programmiert und läuft auch alles ohne Probleme (habs jetzt auch mal getestet bringt garnichts)
    Ist doch der selbe code wie meiner nur mit args.length == 1 das ist ja wie ich oben schon geschrieben habe nicht das Problem, sondern die ArrayList. Mir geht es nicht um den Befehl selbst sondern um die "Wirkung" also um das MapVoting

    LG Disk
     
    #12
  13. JTK222
    Offline

    JTK222

    Registriert seit:
    5. September 2013
    Beiträge:
    665
    Ort:
    Planet Erde
    Minecraft:
    JTK222
    Also ich bekomme eine Fehlermeldung wenn ich das Leer lasse liegt aber vielleicht auch an Forge
     
    #13
  14. Disk
    Offline

    Disk

    Registriert seit:
    20. September 2014
    Beiträge:
    29
    aso, also daran liegt es aufjedenfall nicht nur ich weis leider immer noch nicht woran es liegt...
     
    #14
  15. JTK222
    Offline

    JTK222

    Registriert seit:
    5. September 2013
    Beiträge:
    665
    Ort:
    Planet Erde
    Minecraft:
    JTK222
    so habe eine Vermutung versuch es mal so:
    Code (Text):
    1.  
    2. if(label.equalsIgnoreCase("vote")) {
    3.      if(!voted.contains(p.getName())) {                
    4.            p.sendMessage("Debug 1");
    5.            arenas.add("arena0");        
    6.            arenas.add("arena1");        
    7.            arenas.add("arena2");        
    8.            arenas.add("arena3");        
    9.            arenas.add("arena4");            
    10.            if(arenas.contains(args[0].toLowerCase())) {                  
    11.                  p.sendMessage("Debug 2");                                      
    12.                  int voteint = votes.get(args[0].toLowerCase());                  
    13.                  voteint++;                  
    14.                  votes.put(args[0].toLowerCase(), voteint);          
    15.                  p.sendMessage("Du hast für " + args[0] + " gevotet");    
    16.                  p.sendMessage("Diese Map hat nun " + votes.get(args[0].toLowerCase()) + " votes");  
    17.                  voted.add(p.getName());          
    18.           }else{                
    19.                  p.sendMessage("Diese Map gibt es nicht!");              
    20.           }        
    21.     }else{          
    22.     p.sendMessage("Du hast bereits für eine Map gevotet!");             }
    23.  
    So waren jedenfalls die Tests bei mir erfolgreich
     
    #15
  16. Max98LP
    Offline

    Max98LP

    Registriert seit:
    13. Januar 2013
    Beiträge:
    22
    Ort:
    /home/Max98LP
    Minecraft:
    Max98LP
    Habe deinen Fehler nun nach langem überlegen gefunden:
    Du hast dir einen schreib Fehler in einem onEnable() teil geleistet, weshalb deine ArrayList auch nicht die Arenen beinhaltet.
    Bitte ändere
    Code (Text):
    1. public void onEnbable() {
    2.        
    3.         arenas.add("arena0");
    4.         arenas.add("arena1");
    5.         arenas.add("arena2");
    6.         arenas.add("arena3");
    7.         arenas.add("arena4");
    8.        
    9.        
    10.         for(String all : arenas) {
    11.             votes.put(all, 0);
    12.         }
    13.     }
    zu:
    Code (Text):
    1. public void onEnable() {
    2.        
    3.         arenas.add("arena0");
    4.         arenas.add("arena1");
    5.         arenas.add("arena2");
    6.         arenas.add("arena3");
    7.         arenas.add("arena4");
    8.        
    9.        
    10.         for(String all : arenas) {
    11.             votes.put(all, 0);
    12.         }
    13.     }
    dann sollte es eigentlich Funktionieren.
     
    #16
    MrPyro13 gefällt das.
  17. Disk
    Offline

    Disk

    Registriert seit:
    20. September 2014
    Beiträge:
    29
    oje... sorry das ich euch für einen so blöden Fehler belästige habe aber selbst viele Stunden versucht den Fehler zu beheben...

    naja an alle die hier was geschrieben haben vielen Dank!

    Jetzt funktioniert alles ;)

    LG Disk
     
    #17
  18. JTK222
    Offline

    JTK222

    Registriert seit:
    5. September 2013
    Beiträge:
    665
    Ort:
    Planet Erde
    Minecraft:
    JTK222
    Habe mich auch schon gefragt wieso es beim onEnable nicht geht :D
     
    #18
    Disk gefällt das.
  19. JTK222
    Offline

    JTK222

    Registriert seit:
    5. September 2013
    Beiträge:
    665
    Ort:
    Planet Erde
    Minecraft:
    JTK222
    Das blöde ist ja dass solche Fehler die "gemeinsten" sind weil man einfach
    nicht auf die Idee kommt das es so etwas kleines ist :D
     
    #19
  20. Es gibt übrigens Gründe für Richtlinien und Code-Stil - Beispielsweise @Override hinzuzufügen - in der Regel optional - würde einen Compilerfehler hinzufügen, wenn die Elternklasse diese Methode nicht kennt.

    Davon mal abgesehen, dass es sinnvoll ist Felder generell mit der geringsten Sichtbarkeit zu versehen UND Methoden sinnvoll zu benennen. Der Prefix get für void ist - nach vielen Standards - verboten und verwirrt.

    PS: Ein kleiner Hinweis für die Zukunft: Keine Zitate für Programmcode verwenden, dafür gibt es einen eigenen BB-Code.

    Anmerkungen:
    *hust* Diamond operator (1) *hust*

    Sollte das dein tatsächlicher Ernst sein, so solltest du wirklich aufhören anderen Personen zu empfehlen Java zu lernen ;)

    (1) Nun gut, dieses Konstrukt gibt es zwar "erst" in Java 7, jedoch macht es keinen Sinn im Minecraft Sektor nicht auf Java 7 Standards zu setzen. Beschäftige dich bitte erst mit der Thematik bevor du derartige Antworten gibst.

    Fazit:
    Das Thema ist gegessen, daher ist hier zu.
     
    #20
    MiCrJonas gefällt das.
Status des Themas:
Es sind keine weiteren Antworten möglich.