• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

ArrayList ArrayIndexOutOfBound***ception: 1

Status
Für weitere Antworten geschlossen.

Disk

Minecrafter
Registriert
20 September 2014
Beiträge
29
Alter
39
Diamanten
300
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:
package me.Disk4.MapVoting;

import java.util.ArrayList;
import java.util.HashMap;

import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin implements Listener {


   public ArrayList<String> voted = new ArrayList<>();
   public HashMap<String, Integer> votes = new HashMap<>();
  
   public ArrayList<String> arenas = new ArrayList<>();
  
  
   public void onEnbable() {
    
     arenas.add("arena0");
     arenas.add("arena1");
     arenas.add("arena2");
     arenas.add("arena3");
     arenas.add("arena4");
    
    
     for(String all : arenas) {
       votes.put(all, 0);
     }
   }
  
  
   public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
    {
    if ((sender instanceof Player)) {
       Player p = (Player) sender;
       if(label.equalsIgnoreCase("result")) {
         getResult();
       }
       if(label.equalsIgnoreCase("list")) {
         getList(p);
       }
       if(label.equalsIgnoreCase("vote")) {
         if(!voted.contains(p.getName())) {
         if(arenas.contains(args[1].toLowerCase())) {
          
           int voteint = votes.get(args[1].toLowerCase());
           voteint++;
           votes.put(args[1].toLowerCase(), voteint);
          
           p.sendMessage("Du hast für " + args[1] + " gevotet");
           p.sendMessage("Diese Map hat nun " + votes.get(args[1].toLowerCase()) + " votes");
           voted.add(p.getName());
         }else{
           p.sendMessage("Diese Map gibt es nicht!");
         }
       }else{
         p.sendMessage("Du hast bereits für eine Map gevotet!");
       }
      
    }
    }
    return false;
    }
  
   public void getList(Player p) {
     for(String all : arenas) {
       p.sendMessage(all + votes.get(all));
     }
   }
  
   public void getResult() {
     int max = 0;
     for(int i : votes.values()) {
       if(i > max) {
         max = i;
       }
     }
    
     String winner = "";
    
     for(String all : votes.keySet()) {
       if(votes.get(all) == max) {
         winner = all;
       }
     }
    
     Bukkit.broadcastMessage("Map " + winner + " hat da Mapvoting gewonnen!");
   }
  
}

Und hier die Fehlermeldung:
[22:57:57] [Server thread/INFO]: Disk4 issued server command: /vote arena0
[22:57:57] [Server thread/ERROR]: null
org.bukkit.command.CommandException: Unhandled exception executing command 'vote' in plugin MapVoting v1.0
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46) ~[Spigot.jar:git-Spigot-1.7.9-R0.2-205-g3633afe]
at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:181) ~[Spigot.jar:git-Spigot-1.7.9-R0.2-205-g3633afe]
at org.bukkit.craftbukkit.v1_7_R4.CraftServer.dispatchCommand(CraftServer.java:767) ~[Spigot.jar:git-Spigot-1.7.9-R0.2-205-g3633afe]
at net.minecraft.server.v1_7_R4.PlayerConnection.handleCommand(PlayerConnection.java:1043) [Spigot.jar:git-Spigot-1.7.9-R0.2-205-g3633afe]
at net.minecraft.server.v1_7_R4.PlayerConnection.a(PlayerConnection.java:880) [Spigot.jar:git-Spigot-1.7.9-R0.2-205-g3633afe]
at net.minecraft.server.v1_7_R4.PacketPlayInChat.a(PacketPlayInChat.java:28) [Spigot.jar:git-Spigot-1.7.9-R0.2-205-g3633afe]
at net.minecraft.server.v1_7_R4.PacketPlayInChat.handle(PacketPlayInChat.java:65) [Spigot.jar:git-Spigot-1.7.9-R0.2-205-g3633afe]
at net.minecraft.server.v1_7_R4.NetworkManager.a(NetworkManager.java:186) [Spigot.jar:git-Spigot-1.7.9-R0.2-205-g3633afe]
at net.minecraft.server.v1_7_R4.ServerConnection.c(ServerConnection.java:81) [Spigot.jar:git-Spigot-1.7.9-R0.2-205-g3633afe]
at net.minecraft.server.v1_7_R4.MinecraftServer.v(MinecraftServer.java:734) [Spigot.jar:git-Spigot-1.7.9-R0.2-205-g3633afe]
at net.minecraft.server.v1_7_R4.DedicatedServer.v(DedicatedServer.java:289) [Spigot.jar:git-Spigot-1.7.9-R0.2-205-g3633afe]
at net.minecraft.server.v1_7_R4.MinecraftServer.u(MinecraftServer.java:584) [Spigot.jar:git-Spigot-1.7.9-R0.2-205-g3633afe]
at net.minecraft.server.v1_7_R4.MinecraftServer.run(MinecraftServer.java:490) [Spigot.jar:git-Spigot-1.7.9-R0.2-205-g3633afe]
at net.minecraft.server.v1_7_R4.ThreadServerApplication.run(SourceFile:628) [Spigot.jar:git-Spigot-1.7.9-R0.2-205-g3633afe]
Caused by: java.lang.ArrayIndexOutOfBound***ception: 1
at me.Disk4.MapVoting.Main.onCommand(Main.java:49) ~[?:?]
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[Spigot.jar:git-Spigot-1.7.9-R0.2-205-g3633afe]
... 13 more

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
 
Zuletzt bearbeitet von einem Moderator:

Arthweran

Minecrafter
Registriert
13 Januar 2013
Beiträge
24
Diamanten
304
Minecraft
Arthweran
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:
if(args.length == 0){
    sender.sendMessage("Bitte geben sie mindestens 1 Argument an");
    return true;
}
 

Disk

Minecrafter
Registriert
20 September 2014
Beiträge
29
Alter
39
Diamanten
300
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:
if(args.length == 0){
    sender.sendMessage("Bitte geben sie mindestens 1 Argument an");
    return true;
}
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
 

MrGoms

Redstoneengineer
Registriert
11 März 2015
Beiträge
46
Diamanten
0
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
(...)
LG Disk

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
 

Disk

Minecrafter
Registriert
20 September 2014
Beiträge
29
Alter
39
Diamanten
300
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
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 :)
 

Disk

Minecrafter
Registriert
20 September 2014
Beiträge
29
Alter
39
Diamanten
300
Nicht gerade übersichtlich, aber egal.

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

Code:
if(arenas.comtains(args[0].toLowerCase()))
{
    p.sendMessage("Erfolgreich abgestimmt");
    (...)

}
else
{
    p.sendMessage("Arena nicht vorhanden!");
}
Das macht er ja eben nicht ;)

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

ps. Debug 1 wird ausgegeben Debug 2 nicht
 

JTK222

Threadripper
Registriert
5 September 2013
Beiträge
1.150
Diamanten
323
Minecraft
JTK222
Ich will ja nichts sagen aber:
Code:
public ArrayList<String> arenas = new ArrayList<>();

solltest du mal mit
Code:
public ArrayList<String> arenas = new ArrayList<String>();

austauschen
 

MrGoms

Redstoneengineer
Registriert
11 März 2015
Beiträge
46
Diamanten
0
Code:
public boolean onCommand(CommandSender sender, Command cmd, String cmdLabel, String[] args)
{
    if(sender instanceof Player)
    {
        Player p = (Player sender);
        if(cmd.getName().equalsIgnoreCase("Vote"))
        {
             if(args.lenght == 1)
             {
                 if(arenas.contains(args[0].toLowerCase()))
                 {
                     p.sendMessage("Erfolgreich abgestimmt");
                 }
                 else
                 {
                     p.sendMessage("Arena nicht vorhanden!");
                 }
             }
        }
    }
}

@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
 

Disk

Minecrafter
Registriert
20 September 2014
Beiträge
29
Alter
39
Diamanten
300
Ich will ja nichts sagen aber:
Code:
public ArrayList<String> arenas = new ArrayList<>();

solltest du mal mit
Code:
public ArrayList<String> arenas = new ArrayList<String>();

austauschen
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)
Code:
public boolean onCommand(CommandSender sender, Command cmd, String cmdLabel, String[] args)
{
    if(sender instanceof Player)
    {
        Player p = (Player sender);
        if(cmd.getName().equalsIgnoreCase("Vote"))
        {
             if(args.lenght == 1)
             {
                 if(arenas.contains(args[0].toLowerCase()))
                 {
                     p.sendMessage("Erfolgreich abgestimmt");
                 }
                 else
                 {
                     p.sendMessage("Arena nicht vorhanden!");
                 }
             }
        }
    }
}

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

JTK222

Threadripper
Registriert
5 September 2013
Beiträge
1.150
Diamanten
323
Minecraft
JTK222
so habe eine Vermutung versuch es mal so:
Code:
if(label.equalsIgnoreCase("vote")) {
     if(!voted.contains(p.getName())) {                 
           p.sendMessage("Debug 1"); 
           arenas.add("arena0");         
           arenas.add("arena1");         
           arenas.add("arena2");         
           arenas.add("arena3");         
           arenas.add("arena4");             
           if(arenas.contains(args[0].toLowerCase())) {                  
                 p.sendMessage("Debug 2");                                       
                 int voteint = votes.get(args[0].toLowerCase());                  
                 voteint++;                   
                 votes.put(args[0].toLowerCase(), voteint);          
                 p.sendMessage("Du hast für " + args[0] + " gevotet");     
                 p.sendMessage("Diese Map hat nun " + votes.get(args[0].toLowerCase()) + " votes");   
                 voted.add(p.getName());           
          }else{                 
                 p.sendMessage("Diese Map gibt es nicht!");              
          }        
    }else{          
    p.sendMessage("Du hast bereits für eine Map gevotet!");             }

So waren jedenfalls die Tests bei mir erfolgreich
 

Arthweran

Minecrafter
Registriert
13 Januar 2013
Beiträge
24
Diamanten
304
Minecraft
Arthweran
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:
public void onEnbable() {
       
        arenas.add("arena0");
        arenas.add("arena1");
        arenas.add("arena2");
        arenas.add("arena3");
        arenas.add("arena4");
       
       
        for(String all : arenas) {
            votes.put(all, 0);
        }
    }

zu:
Code:
public void onEnable() {
       
        arenas.add("arena0");
        arenas.add("arena1");
        arenas.add("arena2");
        arenas.add("arena3");
        arenas.add("arena4");
       
       
        for(String all : arenas) {
            votes.put(all, 0);
        }
    }

dann sollte es eigentlich Funktionieren.
 

Disk

Minecrafter
Registriert
20 September 2014
Beiträge
29
Alter
39
Diamanten
300
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:
public void onEnbable() {
      
        arenas.add("arena0");
        arenas.add("arena1");
        arenas.add("arena2");
        arenas.add("arena3");
        arenas.add("arena4");
      
      
        for(String all : arenas) {
            votes.put(all, 0);
        }
    }

zu:
Code:
public void onEnable() {
      
        arenas.add("arena0");
        arenas.add("arena1");
        arenas.add("arena2");
        arenas.add("arena3");
        arenas.add("arena4");
      
      
        for(String all : arenas) {
            votes.put(all, 0);
        }
    }

dann sollte es eigentlich Funktionieren.
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
 

JTK222

Threadripper
Registriert
5 September 2013
Beiträge
1.150
Diamanten
323
Minecraft
JTK222
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:
public void onEnbable() {
      
        arenas.add("arena0");
        arenas.add("arena1");
        arenas.add("arena2");
        arenas.add("arena3");
        arenas.add("arena4");
      
      
        for(String all : arenas) {
            votes.put(all, 0);
        }
    }

zu:
Code:
public void onEnable() {
      
        arenas.add("arena0");
        arenas.add("arena1");
        arenas.add("arena2");
        arenas.add("arena3");
        arenas.add("arena4");
      
      
        for(String all : arenas) {
            votes.put(all, 0);
        }
    }

dann sollte es eigentlich Funktionieren.

Habe mich auch schon gefragt wieso es beim onEnable nicht geht :D
 

JTK222

Threadripper
Registriert
5 September 2013
Beiträge
1.150
Diamanten
323
Minecraft
JTK222
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

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
 
X

|| xX [DEV][LP] Ms. DivaCraft Xx ||

Guest
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:
Ich will ja nichts sagen aber:
Code:
public ArrayList<String> arenas = new ArrayList<>();

solltest du mal mit
Code:
public ArrayList<String> arenas = new ArrayList<String>();

austauschen
*hust* Diamond operator (1) *hust*

Total übersehen *pfeif*
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.
 
Status
Für weitere Antworten geschlossen.
Oben