Fehler Meldung "else without if"

pumpgun99

Neues Mitglied
ich komm nicht voran es zeigt immer diese Fehler Meldung "else without if"
Bin für jede hilfe dankbar:

package de.pumpgun99.plugin1.commands;

import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

public class FlyCommand implements CommandExecutor {

@Override
public boolean onCommand(CommandSender s, Command cmd, String label, String[] args){
if(s.hasPermission("fly.own")){
if(s instanceof Player){
Player p = (Player)s;
if(!p.getAllowFlight()){
p.setAllowFlight(true);
p.setFlying(true);
p.sendMessage("Lets fly!");
}else{
p.setAllowFlight(false);
p.setFlying(false);
p.sendMessage("No fly");
}


} else {
s.sendMessage("§c Du bist ein kein Spieler bitte Logge dich ein ");

}else {
s.sendMessage("§c Du hast keine Rechte ");

return false;
}

}
}
}
 
Code bitte in Code-Tags, dann bleiben die Einrückungen erhalten:
Code:
package de.pumpgun99.plugin1.commands;

import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

public class FlyCommand implements CommandExecutor {

    @Override
    public boolean onCommand(CommandSender s, Command cmd, String label, String[] args){
        if(s.hasPermission("fly.own")){
            if(s instanceof Player){
                Player p = (Player)s;
                if(!p.getAllowFlight()){
                    p.setAllowFlight(true);
                    p.setFlying(true);
                    p.sendMessage("Lets fly!");
                }else{
                    p.setAllowFlight(false);
                    p.setFlying(false);
                    p.sendMessage("No fly");
                }


        } else {
                s.sendMessage("§c Du bist ein kein Spieler bitte Logge dich ein  ");

            }else {
            s.sendMessage("§c Du hast keine Rechte  ");

        return false;
    }

    }
    }
}

Das erste was auffällt - die Einrückungen sind willkürlich. Daher ist es gerade extream schwer zu erkennen ,welches else zu welchem if gehört (Die Verschachtelungstiefe ist auf jeden Fall auch zu hoch, der Code ist kaum lesbar). Aber korrigieren wir mal die Einrückungen (Die erste und letzte öffenende Klammer von der Klasse lass ich mal weg)

Java:
public boolean onCommand(CommandSender s, Command cmd, String label, String[] args){
    if(s.hasPermission("fly.own")){
        if(s instanceof Player){
            Player p = (Player)s;
            if(!p.getAllowFlight()){
                p.setAllowFlight(true);
                p.setFlying(true);
                p.sendMessage("Lets fly!");
            }else{
                p.setAllowFlight(false);
                p.setFlying(false);
                p.sendMessage("No fly");
            }
        } else {
            s.sendMessage("§c Du bist ein kein Spieler bitte Logge dich ein  ");
    }else {
        s.sendMessage("§c Du hast keine Rechte  ");

       return false;
    }
}
}
Was fällt auf? Da ist eine schließende Klammer zu viel. Vermutlich muss die schließende Klammer hinter der "No Fly" Ausgabe weg, und dann sollte alles passen.

Bei sowas generell die Formatierung der IDE nutzen, dass kann jede gute IDE - dann merkt man schnell, das mit den Klammern was im Argen liegt.
 
Was auf jeden fall auch nicht gehen kann (und wohl den Fehler vervorruft:
Java:
} else {
    s.sendMessage("§c Du bist ein kein Spieler bitte Logge dich ein  ");
} else

Zwei else hintereinander geht natürlich nicht. ==> Die }, die am Ende zu viel ist, fehlt da wohl.

Hier ist meine generelle Forderung:
Teile und Herrsche!

Also mach mehr Methoden! Gerade als Anfänger sollte man Methoden kurz und prägnant halten mit guten Namen. Dann hat man auch automatisch eine Chance, seinen eigenen Code nachzuvollziehen.

Und sowas kann man schnell kürzen / aufteilen:

Ursprünglicher Code - mit verbesserter } und das return false ans Ende gestellt, denn alle Durchgänge müssen einen Wert zurück geben!:
Java:
public boolean onCommand(CommandSender s, Command cmd, String label, String[] args) {
    if(s.hasPermission("fly.own")){
        if(s instanceof Player){
            Player p = (Player)s;
            if(!p.getAllowFlight()){
                p.setAllowFlight(true);
                p.setFlying(true);
                p.sendMessage("Lets fly!");
            }else{
                p.setAllowFlight(false);
                p.setFlying(false);
                p.sendMessage("No fly");
            }
        } else {
            s.sendMessage("§c Du bist ein kein Spieler bitte Logge dich ein  ");
        }
    } else {
        s.sendMessage("§c Du hast keine Rechte  ");
    }
    return false;
}

So man nur Commands erlaubt, wenn die Rechte stimmen und ein Spieler vorliegt, dann wäre eine Vereinfachung, dies an den Anfang zu ziehen:
Java:
public boolean onCommand(CommandSender s, Command cmd, String label, String[] args) {
    if(!s.hasPermission("fly.own")) {
        s.sendMessage("§c Du hast keine Rechte  ");
        return false;
    }
    
    if(!(s instanceof Player) {
        s.sendMessage("§c Du bist ein kein Spieler bitte Logge dich ein  ");
        return false;
    }
    
    // Restlicher code ...
}

Das ist dann sozusagen eine Validierung am Anfang der Methode ...

Aber ansonsten werden Funktionalitäten raus gezogen, also z.B. mit einer Methode flyPlayer oder so:
Java:
public boolean onCommand(CommandSender s, Command cmd, String label, String[] args) {
    if(!s.hasPermission("fly.own")) {
        s.sendMessage("§c Du hast keine Rechte  ");
        return false;
    }

    if(!(s instanceof Player) {
        s.sendMessage("§c Du bist ein kein Spieler bitte Logge dich ein  ");
        return false;
    }

    return flyPlayer((Player) s);
}

public boolean flyPlayer(Player p) {
    if(!p.getAllowFlight()){
        p.setAllowFlight(true);
        p.setFlying(true);
        p.sendMessage("Lets fly!");
    }else{
        p.setAllowFlight(false);
        p.setFlying(false);
        p.sendMessage("No fly");
    }
    return true;
}

So in der Art. Auch die Methode könnte man noch unterteilen oder umstrukturieren, aber ich wollte er nur einmal vom Prinzip her zeigen....
 
So in der Art. Auch die Methode könnte man noch unterteilen oder umstrukturieren, aber ich wollte er nur einmal vom Prinzip her zeigen....
Ich würde die Hilfsmethoden allerdings "private" machen. Sie werden ja i. d. R. nicht von außerhalb der Klasse aufgerufen, bzw. sollen das auch nicht werden können: private boolean flyPlayer(Player p)
 

Zurück
Oben