Java To String Methode, Array mit For-Schleife

JaVasIstHierLos?

Neues Mitglied
Hallo,
ich möchte gerne einen "Fahrer" erstellen, der "Fahrer" besitzt einen Heimatort und einen Tagesablauf.
In der Klasse "Fahrer" wird der Fahrer mit seinem Heimatort erstellt:

Java:
package fahrsimulation;

import java.time.LocalDateTime;

import fahrsimulation.Heimatort.Heimatorte;

public class Fahrer {

    Heimatorte heimatort;
    static int ZEITSCHRITT = 15;
    public LocalDateTime start = LocalDateTime.of(2023, 9, 11, 14, 00, 0);
    LocalDateTime end = LocalDateTime.of(2023, 9, 12, 14, 00, 00);
    Tagesablauf zeitscheibe = new Tagesablauf(start, AutoZustand.FAHREN, Wegezweck.Wegezwecke.Arbeit);

    public Fahrer(Heimatorte heimatort, Tagesablauf zeitscheibe) {
        this.heimatort = heimatort;
        this.zeitscheibe = zeitscheibe;
    }

    void starteBerechnung() {
        Heimatort heimatorte = new Heimatort(null);
        heimatort = heimatorte.heimatortberechnung();
    }

    @Override
    public String toString() {
        return "[" + heimatort + zeitscheibe + "]";
    }
}

Der Tagesablauf wird in der Klasse Tagesablauf erstellt und dieser besteht aus einem "Start", einem Zustand (ob das Auto: Fahrt, Parkt,..) und einem Zweck (z.B.Arbeit)
Zustand und Zweck werden über Enum-Klasse generiert.

Die Klasse hab ich wie folgt aufgebaut:
Code:
package fahrsimulation;

import java.time.LocalDateTime;
import java.util.ArrayList;

import fahrsimulation.Wegezweck.Wegezwecke;

public class Tagesablauf {

    public ArrayList<LocalDateTime> zeitscheiben = new ArrayList<>();
    String zeit2;
    Wegezwecke wegezwecke;
    LocalDateTime start;
    public static int ZEITSCHRITT = 15;
    Wegezweck wegezweck = new Wegezweck(null);
    public AutoZustand autoZustand;

    public Tagesablauf(LocalDateTime start, AutoZustand fahren, Wegezwecke arbeit) {
        this.start = start;
        this.autoZustand = fahren;
        this.wegezweck.wegezweck = wegezwecke;
    }

    public LocalDateTime erhoehungZeitscheibe() {
        start = start.plusMinutes(ZEITSCHRITT);
        if (autoZustand == AutoZustand.FAHREN) {
            wegezwecke = wegezweck.wegezweckberechnung();
        } else {
            wegezwecke = null;
        }
        return start;
    }

    @Override
    public String toString() {
        return "[" + zeitscheiben + start + autoZustand + wegezweck + "]";
    }


Beides lasse ich in der Tagesberechnung starten:
Code:
public class Tagesberechnung {

    void starteBerechnung() {
        int anzahlFahrer = 1;
        int anzahlZeitscheiben = 3;
        LocalDateTime start = LocalDateTime.of(2023, 9, 11, 14, 00, 0);
        Fahrer[] fahrer = new Fahrer[anzahlFahrer];
        Tagesablauf[] zeitscheibe = new Tagesablauf[anzahlZeitscheiben];

        for (int j = 0; j < fahrer.length; j++) {
            fahrer[j] = new Fahrer(null, zeitscheibe[j]);
            fahrer[j].starteBerechnung();
            for (int k = 0; k < zeitscheibe.length; k++) {
                zeitscheibe[k] = new Tagesablauf(start.plusMinutes(k * Tagesablauf.ZEITSCHRITT), null, null);
                zeitscheibe[k].erhoehungZeitscheibe();
                System.out.println(fahrer[j] + " " + zeitscheibe[k]);
                System.out.println(fahrer[j].toString());
            }
        }
    }
}

Und diese Tagesberechnung wird im Programm aufgerufen:
Code:
public class Programm {
    public static void main(String[] args) {
        Tagesberechnung tagesberechnung = new Tagesberechnung();
        tagesberechnung.starteBerechnung();
    }
}

Problem habe ich mit der ToString Methode. Über:
Code:
System.out.println(fahrer[j] + " " + zeitscheibe[k]);
erhalte ich folgende Ausgabe: [LaendlicheRegionKleinstaedtischerDoerflicherRaumnull] [[]2023-09-11T14:15nullfahrsimulation.Wegezweck@511baa65] (Wäre für den Start erstmal richtig)
Über die ToString Methode:
Code:
System.out.println(fahrer[j].toString());
erhalte ich die Ausgabe: [LaendlicheRegionKleinstaedtischerDoerflicherRaumnull] (die Zeitscheibe (15 minuten eines Tages, werden hier nicht ausgegeben, da diese laut debuggen "null" ist. Verstehe leider nicht wieso. Könnt ihr mir bitte weiterhelfen? Hoffe ich habe es halbwegs nachvollziehbar beschrieben, falls nicht (bin doch schon etwas vertieft in dem Thema, gerne nachfragen!)
 
Hier erzeugst du eine zeitscheibe und überschreibst sie sofort wieder:
Java:
public class Fahrer {
    // ...

    Tagesablauf zeitscheibe = new Tagesablauf(start, AutoZustand.FAHREN, Wegezweck.Wegezwecke.Arbeit);

    public Fahrer(Heimatorte heimatort, Tagesablauf zeitscheibe) {
        this.heimatort = heimatort;
        this.zeitscheibe = zeitscheibe;
    }
    // ...
 
Hallo schon richtig was bis jetzt gesagt wurde . Es macht keinen sinn die InstanzVariable schon im Klassenrumpf zu setzen. Das du ja beim Erzeugen des Objektes die Instanzen dem Konstruktor übergibst und er es in den Instanzvariablen abspeichert.

da diese laut debuggen "null" ist.

Überlege mal was du hier machst. In der Klasse Tagesberechnung.

for (int j = 0; j < fahrer.length; j++) {
fahrer[j] = new Fahrer(null, zeitscheibe[j]); //zeitscheibe[j] ist null zu dem zeitpunkt

Du übergibst ein Objekt was null ist. Ja du hast ein Array erstellt Zeile 8.
Aber den Feldern des Array hast du keine werte zugeordnet, gesetzt. Sind also noch null.

Du setzt zwar später die Felder des Arrays ab Zeile 14. Nur das Objekt Fahrer ist schon mit Null erstellt, und wird nicht geändert.
 

Zurück
Oben