# If anweisungen zu verschachtelt? else without if



## Hückel (16. Feb 2006)

Hi, mein Compiler zeigt mir dauernd an der gleichen Stelle das ich ein else ohne if habe, ich verstehe aber einfach nicht wieso, habe die Klammern zig mal überprüft und für mich sieht das alles richtig aus, vieleicht hilft es ja was wenn jemand anders einen Blick drauf wirft? Hier der Quellcode:


```
public void EntscheidungsAbfrageSpieler()
  { if (Hubraum.isSelected())

         { Spielkarte Help1=Computer.getObersteKarte();
          int Hubraum1=Help1.getHubraum();
          Spielkarte Help2=Spieler.getObersteKarte();
          int Hubraum2=Help2.getHubraum();

           if (Hubraum1<Hubraum2)
            { SpielerSieg();
            }
            else
            { ComputerSieg();
            }
         }
           else if (Leistung.isSelected())

            {Spielkarte Help1=Computer.getObersteKarte();
             int Leistung1=Help1.getLeistung();
             Spielkarte Help2=Spieler.getObersteKarte();
             int Leistung2=Help2.getLeistung();

             if (Leistung1<Leistung2)
              {SpielerSieg();
              }
              else
              {ComputerSieg();
              }
            }

             else if (Tempo.isSelected());

              { Spielkarte Help1=Computer.getObersteKarte();
                int Tempo1=Help1.getTempo();
                Spielkarte Help2=Spieler.getObersteKarte();
                int Tempo2=Help2.getTempo();

                if (Tempo1<Tempo2)
                {SpielerSieg();
                }
                else
                {ComputerSieg();
                }
               }

                else if (NullHundert.isSelected())
                { Spielkarte Help1=Computer.getObersteKarte();
                  int NullHundert1=Help1.NullHundert();
                  Spielkarte Help2=Spieler.getObersteKarte();
                  int NullHundert2=Help2.getNullHundert();

                  if (NullHundert1<NullHundert2)
                  {SpielerSieg();
                  }
                  else
                  {ComputerSieg();
                  }
                 }


  }
```

Es kann doch eigentlich nicht sein, dass sich nicht mehr als 3 If anweisungen verschachteln lassen oder?


----------



## byte (16. Feb 2006)

Also ausser eine katastrophale Formatierung fällt mir da auch nix auf. In welcher Zeile soll der Fehler denn sein?

Ich rate Dir aber mal, Dich mit den Code Conventions anzufreunden, dadurch vermeidest Du solche Fehler in Zukunft zum großen Teil.


----------



## robertpic71 (16. Feb 2006)

Der Fehler liegt in der Zeile 32:

beim   else if (Tempo.isSelected())*; *

ist der Strichpunkt wegzulassen!!

Hier mal dein Code wie er (so ungefähr) sein sollte:


```
public void EntscheidungsAbfrageSpieler() {

    if (Hubraum.isSelected()) {
        Spielkarte Help1=Computer.getObersteKarte();
        int Hubraum1=Help1.getHubraum();
        Spielkarte Help2=Spieler.getObersteKarte();
        int Hubraum2=Help2.getHubraum();

        if (Hubraum1<Hubraum2) {
            SpielerSieg();
        } else {
            ComputerSieg();
        }

    } else if (Leistung.isSelected()) {
        Spielkarte Help1=Computer.getObersteKarte();
        int Leistung1=Help1.getLeistung();
        Spielkarte Help2=Spieler.getObersteKarte();
        int Leistung2=Help2.getLeistung();

        if (Leistung1<Leistung2) {
            SpielerSieg();
        } else {
            ComputerSieg();
        }

    } else if (Tempo.isSelected()) {
        Spielkarte Help1=Computer.getObersteKarte();
        int Tempo1=Help1.getTempo();
        Spielkarte Help2=Spieler.getObersteKarte();
        int Tempo2=Help2.getTempo();

        if (Tempo1<Tempo2) {
            SpielerSieg();
        } else {
            ComputerSieg();
        }

    } else if (NullHundert.isSelected()) {
        Spielkarte Help1=Computer.getObersteKarte();
        int NullHundert1=Help1.NullHundert();
        Spielkarte Help2=Spieler.getObersteKarte();
        int NullHundert2=Help2.getNullHundert();

        if (NullHundert1<NullHundert2) {
            SpielerSieg();
        } else {
            ComputerSieg();
        }
    }
}
```


----------



## Beni (16. Feb 2006)

Einmal übersichtlich formatieren...

```
public void EntscheidungsAbfrageSpieler(){
        if (Hubraum.isSelected()){
            Spielkarte Help1=Computer.getObersteKarte();
            int Hubraum1=Help1.getHubraum();
            Spielkarte Help2=Spieler.getObersteKarte();
            int Hubraum2=Help2.getHubraum();

            if (Hubraum1<Hubraum2){
                SpielerSieg();
            }
            else{
                ComputerSieg();
            }
        }
        else if (Leistung.isSelected()){
            Spielkarte Help1=Computer.getObersteKarte();
            int Leistung1=Help1.getLeistung();
            Spielkarte Help2=Spieler.getObersteKarte();
            int Leistung2=Help2.getLeistung();

            if (Leistung1<Leistung2){
                SpielerSieg();
            }
            else{
                ComputerSieg();
            }
        }
        
        else if (Tempo.isSelected());{
            Spielkarte Help1=Computer.getObersteKarte();
            int Tempo1=Help1.getTempo();
            Spielkarte Help2=Spieler.getObersteKarte();
            int Tempo2=Help2.getTempo();

            if (Tempo1<Tempo2){
                SpielerSieg();
            }
            else{
                ComputerSieg();
            }
        }

        else if (NullHundert.isSelected()){
            Spielkarte Help1=Computer.getObersteKarte();
            int NullHundert1=Help1.NullHundert();
            Spielkarte Help2=Spieler.getObersteKarte();
            int NullHundert2=Help2.getNullHundert();

            if (NullHundert1<NullHundert2){
                SpielerSieg();
            }
            else{
                ComputerSieg();
            }
        }
    }
```

... und der Fehler auf Zeile 29 sticht ziemlich deutlich ins Auge (da ist ein Zeichen zuviel...)

[Edit: och, jetzt war ich zu langsam]


----------



## Hückel (16. Feb 2006)

Ok danke werd das auch noch besser formatieren, sieht viel besser aus wie ihr das gemacht habt.


----------



## robertpic71 (16. Feb 2006)

Beni hat gesagt.:
			
		

> Einmal übersichtlich formatieren...
> [Edit: och, jetzt war ich zu langsam]



Ja dieser Code schrie förmlich nach Formatierung! Ich bin gerade in Übung, da ich gerade meine Java-Erstlingswerke etwas nachformatiert habe...    

Schön langsam werde ich mich meinem Editor GEL trennen und einen 2. Anlauf mit Websphere machen, da gehen die Einrückungen und Klammern fast von selber.  Aber als Anfänger war mir Eclipse mit 700 PlugIns (= Websphere) zuviel des Guten.... 

Robert P.


----------



## MPW (16. Feb 2006)

robertpic71 hat gesagt.:
			
		

> Beni hat gesagt.:
> 
> 
> 
> ...



Ich habe auch lange mit einem Editor programmiert, dass ist doch kein Grund die Formatierung ueber den Haufen zu schmeissen?


----------



## vah (17. Feb 2006)

Und wenn Du es ganz übersichtlich haben möchstest, dann setzt Du die jeweils korrespondierenden
Klammern senkrecht übereinander. Das entspricht zwar nicht den Sun-Konventionen und erhöht
die Zeilenzahl, macht aber den Quellcode deutlich lesbarer!





```
public void EntscheidungsAbfrageSpieler()
   {
        if (Hubraum.isSelected())
        {
            Spielkarte Help1=Computer.getObersteKarte();
            int Hubraum1=Help1.getHubraum();
            Spielkarte Help2=Spieler.getObersteKarte();
            int Hubraum2=Help2.getHubraum();

            if (Hubraum1<Hubraum2)
            {
                SpielerSieg();
            }
            else
            {
                ComputerSieg();
            }
        }
        else if (Leistung.isSelected())
        {
            Spielkarte Help1=Computer.getObersteKarte();
            int Leistung1=Help1.getLeistung();
            Spielkarte Help2=Spieler.getObersteKarte();
            int Leistung2=Help2.getLeistung();

            if (Leistung1<Leistung2)
            {
                SpielerSieg();
            }
            else
            {
                ComputerSieg();
            }
        }
        else if (Tempo.isSelected()) 
        {
            Spielkarte Help1=Computer.getObersteKarte();
            int Tempo1=Help1.getTempo();
            Spielkarte Help2=Spieler.getObersteKarte();
            int Tempo2=Help2.getTempo();

            if (Tempo1<Tempo2)
            {
                SpielerSieg();
            }
            else
            {
                ComputerSieg();
            }
        }
        else if (NullHundert.isSelected())
        {
            Spielkarte Help1=Computer.getObersteKarte();
            int NullHundert1=Help1.NullHundert();
            Spielkarte Help2=Spieler.getObersteKarte();
            int NullHundert2=Help2.getNullHundert();

            if (NullHundert1<NullHundert2)
            {
                SpielerSieg();
            }
            else
            {
                ComputerSieg();
            }
        }
   }
```



vah


----------



## Sky (17. Feb 2006)

Um das ganze noch übersichtlicher zu machen:


```
public void EntscheidungsAbfrageSpieler() {
    Spielkarte Help1 = Computer.getObersteKarte();
    Spielkarte Help2 = Spieler.getObersteKarte();

    int value1;
    int value2;

    if (Hubraum.isSelected()) {
      value1 = Help1.getHubraum();
      value2 = Help2.getHubraum();
    } else if (Leistung.isSelected()) {
      value1 = Help1.getLeistung();
      value2 = Help2.getLeistung();
    } else if (Tempo.isSelected()) {
      value1 = Help1.getTempo();
      value2 = Help2.getTempo();
    } else if (NullHundert.isSelected()) {
      value1 = Help1.NullHundert();
      value2 = Help2.getNullHundert();
    }

    if (value1 < value2) {
      SpielerSieg();
    } else {
      ComputerSieg();
    }
  }
```

Alles was in allen if-Anweisungen gemacht wird, lässt sich m.E. auslagern: Also, Karten werden immer gezogen (vor den if's) und Auswertungen werden auch immer gemacht (nach den if's)

btw. gleiches Ergebnis mit 60% weniger Code ;-)


----------

