# JavaEditor - Quellcode Fehler



## bilel01 (18. Okt 2017)

*Aufgabe: 

Implementieren Sie ein Programm zu Ihrem Handy-Automaten (falls Sie keinen Automaten haben, wählen Sie eine der Lösungen, die wir am 12.10. durchgesprochen haben). Das Programm soll in einer Endlosschleife Kommandos von der Tastatur einlesen und entsprechend der Eingabe in einen neuen Zustand wechseln. Der neue Zustand soll jeweils als Text ausgegeben werden.
Zusatzaufgabe: Implementieren Sie eine Hilfsfunktion, die bei entsprechender Eingabe (z.B. h) eine Übersicht aller Kommandos ausgibt.
*Ich hab die Aufgaben versucht so gut es geht zu bearbeiten,f geht, aber die Befehle l und h gehen nicht bei starten der Applikation, und bei k gehen nur die ersten 2. Vielleicht seht ihr womöglich, wo hier die/der Fehler liegt. Damit ihr besser versteht, was ich genauer meine, hier ist der Quellcode.

/**
  * k,l oder h für den nächsten Zustand   
  * f für Übersicht über die Kommandos
  * Schluss um das programm zu beenden
  */

  import java.util.Scanner;

public class Handyautomat {

  enum Zustand {
    ShutdownModus,GesperrtDisplayAn,GesperrtDisplayAus,Entsperrt,Aus,Pin
  }

  public static void main(String[] args) {
    String I;
    Scanner eingabewert = new Scanner(System.in);
    Zustand aktuellerZustand = Zustand.GesperrtDisplayAus;
    int i = 1;

    System.out.println("Drücke k,l oder h um in den nächsten Zustand zu kommen.");
    do {
      I = eingabewert.next();

      if (I.equals("*k*")) {
        switch(aktuellerZustand){
          case GesperrtDisplayAn: 
          aktuellerZustand = Zustand.GesperrtDisplayAus;
          System.out.println("Das Gerätedisplay ist angeschaltet.");
          break; 
          case GesperrtDisplayAus:   
          aktuellerZustand = Zustand.GesperrtDisplayAn;
          System.out.println("Das Gerätedisplay ist ausgeschaltet.");
          break;
          case ShutdownModus: 
          aktuellerZustand = Zustand.ShutdownModus;
          System.out.println("Shutdown Modus ist geöffnet.");
          break;
          case Entsperrt:
          aktuellerZustand = Zustand.GesperrtDisplayAus;   
          System.out.println("Das Gerätedisplay ist ausgeschaltet.");
          break; 
          case Aus:
          aktuellerZustand = Zustand.Aus;
          System.out.println("Das Gerät ist ausgeschaltet.");
          break;
          case Pin:
          aktuellerZustand = Zustand.GesperrtDisplayAus;
          System.out.println("Das Gerätedisplay ist ausgeschaltet.");
          break;
        }
          if (I.equals("*l*")) {       
          switch(aktuellerZustand){
            case GesperrtDisplayAn: 
            aktuellerZustand = Zustand.ShutdownModus;
            System.out.println("Shutdown Modus ist geöffnet.");
            break; 
            case GesperrtDisplayAus:   
            aktuellerZustand = Zustand.ShutdownModus;
            System.out.println("Shutdown Modus ist geöffnet.");
            break;
            case ShutdownModus: 
            aktuellerZustand = Zustand.ShutdownModus;
            System.out.println("ShutdownModus ist geöffnet.");
            break;
            case Entsperrt:
            aktuellerZustand = Zustand.ShutdownModus;   
            System.out.println("ShutdownModus ist geöffnet.");
            break; 
            case Aus:
            aktuellerZustand = Zustand.GesperrtDisplayAn;
            System.out.println("Das Gerätedisplay ist angeschaltet.");
            break;
            case Pin:
            aktuellerZustand = Zustand.ShutdownModus;
            System.out.println("Shutdown Modus ist geöffnet.");
            break;
          }
          if (I.equals("*h*")) {
            switch(aktuellerZustand){
              case GesperrtDisplayAn: 
              aktuellerZustand = Zustand.Pin;
              System.out.println("Pineingabe ist geöffnet.");
              break; 
              case GesperrtDisplayAus:   
              aktuellerZustand = Zustand.GesperrtDisplayAn;
              System.out.println("Das Gerätedisplay ist angeschaltet.");
              break;
              case ShutdownModus: 
              aktuellerZustand = Zustand.ShutdownModus;
              System.out.println("ShutdownModus ist geöffnet.");
              break;
              case Entsperrt:
              aktuellerZustand = Zustand.Entsperrt;   
              System.out.println("Das Gerät wurde erfolgreich entsperrt.");
              break; 
              case Aus:
              aktuellerZustand = Zustand.Aus;
              System.out.println("Das Geräte ist ausgeschaltet.");
              break;
              case Pin:
              aktuellerZustand = Zustand.Entsperrt;
              System.out.println("Das Gerät wurde erfolgreich entsperrt.");
              break;
            } 
          } // end of if
        } // end of switch

      } // end of if

      if (I.equals("*f*")) {
        System.out.println("k: Kurzer Druck auf An-Aus Knopf,l: Langer Druck auf An-Aus Knopf,h:Kurzer Duck auf Home-Button");
      } // end of if 

      else {
        System.out.println("Drücke k,l oder h um in den nächsten Zustand zu kommen.");
      }

      if (I.equals("Schluss")){
        i = 3;
      } 
    } while (i<2);
  } // end of main

} // end of class Handyautomat


----------



## Robat (18. Okt 2017)

Poste dein Code bitte in [code=Java]MY CODE[/code] Tags. 
So kann man eventuelle Fehler schneller finden.


----------



## bilel01 (18. Okt 2017)

```
import java.util.Scanner;

public class Handyautomat {

enum Zustand {
ShutdownModus,GesperrtDisplayAn,GesperrtDisplayAus,Entsperrt,Aus,Pin
}

public static void main(String[] args) {
String I;
Scanner eingabewert = new Scanner(System.in);
Zustand aktuellerZustand = Zustand.GesperrtDisplayAus;
int i = 1;

System.out.println("Drücke k,l oder h um in den nächsten Zustand zu kommen.");
do {
I = eingabewert.next();

if (I.equals("[B]k[/B]")) {
switch(aktuellerZustand){
case GesperrtDisplayAn: 
aktuellerZustand = Zustand.GesperrtDisplayAus;
System.out.println("Das Gerätedisplay ist angeschaltet.");
break; 
case GesperrtDisplayAus: 
aktuellerZustand = Zustand.GesperrtDisplayAn;
System.out.println("Das Gerätedisplay ist ausgeschaltet.");
break;
case ShutdownModus: 
aktuellerZustand = Zustand.ShutdownModus;
System.out.println("Shutdown Modus ist geöffnet.");
break;
case Entsperrt:
aktuellerZustand = Zustand.GesperrtDisplayAus; 
System.out.println("Das Gerätedisplay ist ausgeschaltet.");
break; 
case Aus:
aktuellerZustand = Zustand.Aus;
System.out.println("Das Gerät ist ausgeschaltet.");
break;
case Pin:
aktuellerZustand = Zustand.GesperrtDisplayAus;
System.out.println("Das Gerätedisplay ist ausgeschaltet.");
break;
}
if (I.equals("[B]l[/B]")) { 
switch(aktuellerZustand){
case GesperrtDisplayAn: 
aktuellerZustand = Zustand.ShutdownModus;
System.out.println("Shutdown Modus ist geöffnet.");
break; 
case GesperrtDisplayAus: 
aktuellerZustand = Zustand.ShutdownModus;
System.out.println("Shutdown Modus ist geöffnet.");
break;
case ShutdownModus: 
aktuellerZustand = Zustand.ShutdownModus;
System.out.println("ShutdownModus ist geöffnet.");
break;
case Entsperrt:
aktuellerZustand = Zustand.ShutdownModus; 
System.out.println("ShutdownModus ist geöffnet.");
break; 
case Aus:
aktuellerZustand = Zustand.GesperrtDisplayAn;
System.out.println("Das Gerätedisplay ist angeschaltet.");
break;
case Pin:
aktuellerZustand = Zustand.ShutdownModus;
System.out.println("Shutdown Modus ist geöffnet.");
break;
}
if (I.equals("[B]h[/B]")) {
switch(aktuellerZustand){
case GesperrtDisplayAn: 
aktuellerZustand = Zustand.Pin;
System.out.println("Pineingabe ist geöffnet.");
break; 
case GesperrtDisplayAus: 
aktuellerZustand = Zustand.GesperrtDisplayAn;
System.out.println("Das Gerätedisplay ist angeschaltet.");
break;
case ShutdownModus: 
aktuellerZustand = Zustand.ShutdownModus;
System.out.println("ShutdownModus ist geöffnet.");
break;
case Entsperrt:
aktuellerZustand = Zustand.Entsperrt; 
System.out.println("Das Gerät wurde erfolgreich entsperrt.");
break; 
case Aus:
aktuellerZustand = Zustand.Aus;
System.out.println("Das Geräte ist ausgeschaltet.");
break;
case Pin:
aktuellerZustand = Zustand.Entsperrt;
System.out.println("Das Gerät wurde erfolgreich entsperrt.");
break;
} 
} // end of if
} // end of switch

} // end of if

if (I.equals("[B]f[/B]")) {
System.out.println("k: Kurzer Druck auf An-Aus Knopf,l: Langer Druck auf An-Aus Knopf,h:Kurzer Duck auf Home-Button");
} // end of if 

else {
System.out.println("Drücke k,l oder h um in den nächsten Zustand zu kommen.");
}

if (I.equals("Schluss")){
i = 3;
} 
} while (i<2);
} // end of main

} // end of class Handyautomat
```


----------



## Robat (18. Okt 2017)

Hab mir mal die Mühe gemacht und deinen Code ordentlich formatiert und "unwichtige" Sachen raus genommen.
Schau dir mal den Aufbau an - vielleicht siehst du ja den Fehler 
(Tipp: Schau mal auf die Klammerung)


```
do {
    I = eingabewert.next();
    if (I.equals("k")) {
        switch (aktuellerZustand) {
            //...
        }
        if (I.equals("l")) {
            switch (aktuellerZustand) {
                //....
            }
            if (I.equals("h")) {
                switch (aktuellerZustand) {
                    // ...
                }
            } 
        } 
    } 

    if (I.equals("f")) {
        //...
    }
    else {
       // ...
    }

    if (I.equals("Schluss")) {
        // ...
    }
} while (i < 2);
```


----------



## bilel01 (18. Okt 2017)

Liegts vielleicht an if (I.equals("...")) Oder an zu vielen Klammern ({})?


----------



## Robat (18. Okt 2017)

Nicht raten.. schauen.
Du willst alle Fälle *k*, *l*, und *h* unabhängig von einander prüfen.
Momentan hängen aber *l * und *h* davon ab, ob *k *geschrieben wurde


----------



## bilel01 (18. Okt 2017)

Achso.. sorry ich bin noch Anfänger. Wie kann ich das so umschreiben, dass ich die Fälle unabhängig von einander prüfen kann?


----------



## JCODA (18. Okt 2017)

bilel01 hat gesagt.:


> Achso.. sorry ich bin noch Anfänger. Wie kann ich das so umschreiben, dass ich die Fälle unabhängig von einander prüfen kann?


Die ifs sollten hintereinander und nicht ineinander stehen.


----------



## bilel01 (18. Okt 2017)

JCODA hat gesagt.:


> Die ifs sollten hintereinander und nicht ineinander stehen.


Was heißt das im Klartext, also konkret. Wie gesagt, ich bin Anfänger. Für mich sieht das nach hintereinander aus, was sollte denn verändert werden konkret.


----------



## bilel01 (18. Okt 2017)

JCODA hat gesagt.:


> Die ifs sollten hintereinander und nicht ineinander stehen.



So hab das dann doch im nachhinein jetzt verstanden. Aber wenn ich das Programm nun teste und App. starte und auf die cases schalte, schaltet er nicht auf alle. Nur auf einige wenige. Bei k auf case 1 und 2, bei l auf 1 (und glaub einige weitere, also Shutdown Modus wird angezeigt) und bei h wird auch nur Shutdown modus angezeigt. Also es funktioniert aufjedenfall besser, nur noch nicht einwandfrei, also dass auf alle cases geschaltet werden. Hoffe man versteht das Anliegen


----------

