Raffi: Java Hausaufgabe mit Klassen

Hallo Leute

Ich habe ein Java Hausaufgabe bei der ich leider nicht weiter komme. Habe erst seit 2 Monaten Java in der Schule.

Ich erstelle eine neue Instanz der klasse Auto:

case 1:
   {
   anzAutos ++;
   System.out.print("\nBitte geben Sie eine Automarke ein: ");
   marke = in.readLine();

System.out.print("\nBitte geben Sie die Anzahl Raeder ein: ");
   raeder = Integer.parseInt(in.readLine());

System.out.print("\nBitte geben Sie die Farbe ein: ");
   farbe = in.readLine();

System.out.print("\nBitte geben Sie die Geschwindigkeit ein: ");
   geschwindigkeit = Integer.parseInt(in.readLine());

System.out.print("\nLicht ein [1]  Licht aus: [0]: ");
   licht = Integer.parseInt(in.readLine());
   if (licht == 1)
   {
    licht1 = true;
   }

if (licht == 0)
   {
    licht1 = false;
   }

System.out.print("\nMotor ein [1]  Motor aus: [0]: ");
   motor = Integer.parseInt(in.readLine());
   if (motor == 1)
   {
    motor1 = true;
   }

if (motor == 0)
   {
    motor1 = false;
   }

Auto a1 = new Auto(raeder, marke, farbe, geschwindigkeit, licht1, motor1);

a1.liefereZustand();

break;

Das objekt a1 wird auch perfekt erstellt und der Zustand des Autos ausgegeben.

Nun wiederholt sich der ganze Switch durch eine for Schlaufe 10 mal. Wenn der Benutzer nun die zahl 2 eingibt, sollte er das Auto a1 in Bewegung setzen können:

case 2:
   {

System.out.print("\nWelches Auto moechten Sie bearbeiten: ");
   autoNr = Integer.parseInt(in.readLine());

System.out.print("\nMit welcher Geschwindigkeit soll das Auto fahren: ");
   geschwindigkeit = Integer.parseInt(in.readLine());

a1.fahrLos();
   break;

}

Nur leider passt das dem Compiler nicht:
---------- Compiler ----------
Aufgabe1.java:111: cannot resolve symbol
symbol  : variable a1
location: class Aufgabe1
   a1.fahrLos();
                        ^
1 error

Nun die Frage: Wie kann ich aus dem Case2 auf das Objekt das ich zuvor in Case1 erstellt habe zugreiffen?

Danke und Gruss
Raffi

  1. Hallo!

    Nur leider passt das dem Compiler nicht:
    ---------- Compiler ----------
    Aufgabe1.java:111: cannot resolve symbol
    symbol  : variable a1
    location: class Aufgabe1
       a1.fahrLos();
                            ^
    1 error

    Nun die Frage: Wie kann ich aus dem Case2 auf das Objekt das ich zuvor in Case1 erstellt habe zugreiffen?

    Das ganze schaut ja vereinfacht so aus:

    for(...)
      switch(zahl) {
        case 1:
            // ...
            Auto a1 = ...;
            break;
        case 2:
            // ...
            a1.fahrLos();
            break;
      }

    Wenn switch(1) aufgerufen wird, wird das Auto-Objekt a1 erstellt. Das _kann_ passieren, _muss_ aber nicht. Denn falls nur case 2 eintritt, existiert a1 überhaupt nicht (auch wenn Du durch die Schleife eigentlich sicherstellst, dass zuerst switch(1) durchlaufen wird). In der Regel gilt: Alle innerhalb einer bedingten Anweisung deklarierten Objekte sind von "außerhalb" nicht zugänglich und werden vom Compiler angekreidet, falls man sie trotzdessen benutzen möchte. Deklariere deshalb das Auto a1 _vor_ der switch-Anweisung und nicht in einer bedingten Verzeigung.

    Oliver

    --
    Gewissen: Die innere Stimme, die uns warnt, weil jemand zuschauen koennte.
    1. Hallo Oliver und Raffi!

      Wenn switch(1) aufgerufen wird, wird das Auto-Objekt a1 erstellt. Das _kann_ passieren, _muss_ aber nicht. Denn falls nur case 2 eintritt, existiert a1 überhaupt nicht (auch wenn Du durch die Schleife eigentlich sicherstellst, dass zuerst switch(1) durchlaufen wird). In der Regel gilt: Alle innerhalb einer bedingten Anweisung deklarierten Objekte sind von "außerhalb" nicht zugänglich und werden vom Compiler angekreidet, falls man sie trotzdessen benutzen möchte. Deklariere deshalb das Auto a1 _vor_ der switch-Anweisung und nicht in einer bedingten Verzeigung.

      Die verschiedenen case zweige werden ja in unterschiedlichen Schleifendurchläufen ausgeführt. Wenn man nun einfach die Deklaration der Variable nach vorn stellt, kompiliert das Programm also immer noch nicht, da die Variable nicht immer initialisiert wird.

      Das Programm soll ja im case 2 Zweig ein beleibiges Auto über eine Nummer ansprechen können. Dafür braucht man eine Liste, in die man die Autos speichern kann. Diese Liste muss natürlich außerhalb der Schleife deklariert werden, damit sie immer verfügbar ist.

      Listen gibt es im Paket java.util.*;

      Kleines Beispiel wie man das Problem lösen könnte:

      java.util.ArrayList liste = new java.util.ArrayList();

      for(...) {
        switch(...) {
          case 1:
            Auto a1 = new Auto(); //neues Auto erzeugen wie gehabt.
            liste.add(a1); // neues Auto speichern.
            break;
          case 2:
            int i = ...; //Auto Nummer einlesen.
            Auto a1 = (Auto)liste.get(i) //Auto aus der Liste holen.
        }
      }

      Grüße

      Daniel

      1. Hallo Daniel!

        Wenn man nun einfach die Deklaration der Variable nach vorn stellt, kompiliert das Programm also immer noch nicht, da die Variable nicht immer initialisiert wird.

        Doch, wenn man ihr ein null-Objekt zuweist. Eine Prüfung, ob das Auto existiert, sollte im zweiten Zweig so oder so stattfinden.

        Das Programm soll ja im case 2 Zweig ein beleibiges Auto über eine Nummer ansprechen können.

        Wo hat Raffi das denn gesagt? Er wollte doch nur das Auto a1 ansprechen. Ich erinnere an seine Aussage:

        Wenn der Benutzer nun die zahl 2 eingibt, sollte er das Auto a1 in Bewegung setzen können.

        Doch bei genauerem Hinsehen glaube ich auch, dass Du recht hast. Zumindest spricht Raffis Codezeile

        System.out.print("\nWelches Auto moechten Sie bearbeiten: ");

        stark dafür ;-)

        Oliver

        --
        Man kann sein Leben weder verlaengern, noch verbreitern - nur vertiefen.