All 2 branches missed, NullPointerException?

funktionierdoch

Cadet 2nd Year
Dabei seit
Dez. 2018
Beiträge
19
Exception in thread "main" java.lang.NullPointerException
at de.weihnachten.Schlitten.getGewicht(Schlitten.java:33)
at de.weihnachten.Schlitten.kannFliegen(Schlitten.java:40)
at de.weihnachten.Weihnachten.main(Weihnachten.java:36)


Aufgabenstellung:
https://docdro.id/7eyr4NO

Meine Klassen als ZIP:
https://de.files.fm/f/fpvpqgkc

Hi Leute,
ich fand nach langer Suche leider keine Lösung für mein Problem. Ich kann meine Hauptklasse "Weihnachten" nach 3 Anweisungen nicht weiter ausführen. Oben sind die Dateien der Aufgabenstellung (optional) und meine Klassen zu finden. Ich hoffe ihr könnt mir weiterhelfen. Vielen Dank
 

Panzenbaby

Cadet 3rd Year
Dabei seit
Apr. 2017
Beiträge
42
Hi. Ich würde dir gerne helfen aber eine Zip werde ich mir nicht laden und öffnen :)
Du kannst deine Klasse hier aber gerne als Code posten ;)
 

funktionierdoch

Cadet 2nd Year
Ersteller dieses Themas
Dabei seit
Dez. 2018
Beiträge
19
Oh okay. Inzwischen habe ich das Problem gelöst, aber mir werden Arrayfehler im Zusammenhang mit meinen Methoden gezeigt.

Fehler:

Bitte geben Sie die Anzahl der Rentiere ein:
4
Bitte geben Sie die Anzahl der Geschenke ein:
10
Bitte geben Sie den Futtervorrat in kg ein:
100
Wir starten Weihnachten mit 10 Geschenken 4 Rentier(en) und einem Schlitten mit 103 kg.
Die Rentiere sind:
- Ich bin ein Rentier mit indiv. Hunger 2.4673953961543535 und Gewicht 256 kg
- Ich bin ein Rentier mit indiv. Hunger 1.3866421705808056 und Gewicht 289 kg
- Ich bin ein Rentier mit indiv. Hunger 1.0089075830277032 und Gewicht 277 kg
- Ich bin ein Rentier mit indiv. Hunger 1.1042876426694812 und Gewicht 236 kg
Die Tour beginnt:
Der Weihnachtsmann liefert aus:
de.weihnachten.Geschenk@6a5fc7f7
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
at de.weihnachten.Schlitten.getRentier(Schlitten.java:77)
at de.weihnachten.Weihnachtsmann.kannNochFuettern(Weihnachtsmann.java:27)
at de.weihnachten.Weihnachten.main(Weihnachten.java:65)

Klasse Weihnachtsmann:
Java:
package de.weihnachten;

public class Weihnachtsmann extends WeihnachtsObjekt {
private double futtervorrat;
private Schlitten schlitten;


public Weihnachtsmann(double futtervorrat, Schlitten schlitten) {
this.futtervorrat = futtervorrat;
this.schlitten = schlitten;
}

public boolean istFertig() {
// (Oder return this.schlitten.istLeer();)
boolean geschenkeAusgeliefert = false;
if (this.schlitten.istLeer()) {
return true;
}
return geschenkeAusgeliefert;
}

public boolean kannNochFuettern() {
double gesamtHunger = 0;
Geschenk naechstGeschenk = schlitten.getNaechstesGeschenk();

for (int i = 0; i <= schlitten.getAnzahlRentiere(); i++) {
gesamtHunger += schlitten.getRentier(i).getHunger(
naechstGeschenk.getGewicht());
}

return futtervorrat > gesamtHunger;
}

public void naechstesGeschenkAusliefern() {
if (this.schlitten.istLeer()) {
System.out.println("Der Weihnachtsmann ist fertig mit der "
+ "Auslieferung. Schöne Weihnachten.");
} else {
System.out.println(this.schlitten.getNaechstesGeschenk());
}
}

public void fuettern() {
for (int i = 0; i <= schlitten.getAnzahlRentiere(); i++) {
futtervorrat -= schlitten.getRentier(i).getHunger();
}
}


public static void main(String[] args) {

}

}
Klasse Schlitten:
Java:
package de.weihnachten;


public class Schlitten extends WeihnachtsObjekt {

private Rentier[] rentiere;
private Geschenk[] geschenke;


public Schlitten(Rentier[] rentiere, Geschenk[] geschenke) {
this.rentiere = rentiere;
this.geschenke = geschenke;
}

public Geschenk getNaechstesGeschenk() {
Geschenk[] temp = new Geschenk[this.geschenke.length];

temp[0] = this.geschenke[0];

for (int i = 1; i < temp.length; i++) {
temp[I] = this.geschenke[I];
}
for (int i = 0; i < temp.length; i++) {
this.geschenke[I] = temp[I];
}

return temp[0];
}

public int getGewicht() {
int gGewicht = 0;
for (int i = 0; i < this.geschenke.length; i++) {
gGewicht += this.geschenke[I].getGewicht();
}
return gGewicht;

}

public boolean kannFliegen() {
return 100 * Math.sqrt(rentiere.length) > getGewicht();
}

public boolean istLeer() {
if (geschenke.length == 0) {
return true;
}
return false;
}

public int getAnzahlRentiere() {
int zaehler = 0;

for (int i = 0; i < rentiere.length; i++) {
zaehler++;
}

return zaehler;
}

public int getAnzahlGeschenke() {
int zaehler = 0;

for (int i = 0; i < geschenke.length; i++) {
zaehler++;
}

return zaehler;

}

public Rentier getRentier(int index) {
if (index < 0 && index > getAnzahlRentiere()) {
System.out.println("Index muss zwischen 0 und der Anzahl der"
+ " Rentiere sein!");
return null;
}
return rentiere[index];
}



public static void main(String[] args) {

}
}
Klasse Weihnachten (Hauptklasse):
Java:
package de.weihnachten;

public class Weihnachten {

public static void main(String[] args) {
java.util.Scanner scanner = new java.util.Scanner(System.in); 
int arraygroesseRentiere;

do {
System.out.println("Bitte geben Sie die Anzahl der Rentiere ein: ");
arraygroesseRentiere = scanner.nextInt();
} while(arraygroesseRentiere < 0);

Rentier[] rentiere = new Rentier[arraygroesseRentiere];
for (int i = 0; i < arraygroesseRentiere; i++) {
rentiere[I] = new Rentier();
}

int arraygroesseGeschenke;
do {
System.out.println("Bitte geben Sie die Anzahl der Geschenke ein:");
arraygroesseGeschenke = scanner.nextInt();
} while(arraygroesseGeschenke < 0);

Geschenk[] geschenke = new Geschenk[arraygroesseGeschenke];
for (int i = 0; i < arraygroesseGeschenke; i++) {
geschenke[I] = new Geschenk();
}
double eingabeFutter;
do {
System.out.println("Bitte geben Sie den Futtervorrat in kg ein: ");
eingabeFutter = scanner.nextDouble();
} while(eingabeFutter < 0);

Schlitten neuerSchlitten = new Schlitten(rentiere, geschenke);

Weihnachtsmann derWeihnachtsmann = new Weihnachtsmann(eingabeFutter,
neuerSchlitten);

if (neuerSchlitten.kannFliegen()) {
System.out.println("Wir starten Weihnachten mit "
+ arraygroesseGeschenke + " Geschenken " 
+ arraygroesseRentiere + " Rentier(en) und einem"
+ " Schlitten mit " + neuerSchlitten.getGewicht()
+ " kg.");
} else {
System.out.println("Eingabe fehlerhaft! Rentiere koennen nicht" 
+ " losfliegen! Programmende!");
System.exit(1);
}

System.out.println("Die Rentiere sind:");

for (int i = 0; i < rentiere.length; i++) {
System.out.println(neuerSchlitten.getRentier(i).asString());
}

System.out.println("Die Tour beginnt:");

System.out.println(" Der Weihnachtsmann liefert aus: ");

for (int i = 0; i < arraygroesseGeschenke; i++) {
derWeihnachtsmann.naechstesGeschenkAusliefern();

if (derWeihnachtsmann.kannNochFuettern()) {
System.out.println("Der Weihnachtsmann ist fertig mit der"
+ " Auslieferung. Schöne Weihnachten.");
} else {
System.out.println("Der Futtervorrat reicht nicht aus! "
+ "Programmende!");
System.exit(1);
}
}
scanner.close();
System.exit(1);
}
}
[/I][/I][/I][/I][/I][/I][/I]
 

Panzenbaby

Cadet 3rd Year
Dabei seit
Apr. 2017
Beiträge
42
Java:
public Rentier getRentier(int index) {
    if (index < 0 && index > getAnzahlRentiere()) {
        System.out.println("Index muss zwischen 0 und der Anzahl der" + " Rentiere sein!");
        return null;
    }
    return rentiere[index];
}
Deine Abfrage lässt hier den Fehler zu. Stabilder wäre es so
Java:
public Rentier getRentier(int index) {
    if (index < 0 && index >= getAnzahlRentiere()) {
        System.out.println("Index muss zwischen 0 und der Anzahl der" + " Rentiere sein!");
        return null;
    }
    return rentiere[index];
}
Deine Methode getAnzahlRentiere() ist auch etwas unnötig, da du ein mal durch das Array durch gehst und für jedes element einen Zähler hoch zählst. Du könntest aber auch gleich geschenke.length zurück geben.

Letztendlich fliegt die Exception aber wegen einem Fehler in der Klasse Weihnachtsmann
Java:
for (int i = 0; i <= schlitten.getAnzahlRentiere(); i++) {
    gesamtHunger += schlitten.getRentier(i).getHunger(naechstGeschenk.getGewicht());
}
Du gehst hier ein mal zu oft durch die Schleife
Java:
for (int i = 0; i < schlitten.getAnzahlRentiere(); i++) {
    gesamtHunger += schlitten.getRentier(i).getHunger(naechstGeschenk.getGewicht());
}
 

funktionierdoch

Cadet 2nd Year
Ersteller dieses Themas
Dabei seit
Dez. 2018
Beiträge
19
Oh, stimmt das vergesse ich manchmal bei Arrays, danke dir!
Ich würde mich freuen, wenn du mir bei einer letzten Sache helfen würdest. :confused_alt:

Aktuelle Ausgabe:
Bitte geben Sie die Anzahl der Rentiere ein:
5
Bitte geben Sie die Anzahl der Geschenke ein:
10
Bitte geben Sie den Futtervorrat in kg ein:
100
Wir starten Weihnachten mit 10 Geschenken 5 Rentier(en) und einem Schlitten mit 74 kg.
Die Rentiere sind:
- Ich bin ein Rentier mit indiv. Hunger 1.8690697361925832 und Gewicht 215 kg
- Ich bin ein Rentier mit indiv. Hunger 2.842327071413156 und Gewicht 259 kg
- Ich bin ein Rentier mit indiv. Hunger 2.170986200033988 und Gewicht 251 kg
- Ich bin ein Rentier mit indiv. Hunger 1.6875010108598079 und Gewicht 282 kg
- Ich bin ein Rentier mit indiv. Hunger 2.7472239546834443 und Gewicht 287 kg
Die Tour beginnt:
Der Weihnachtsmann liefert aus:
10
Der Weihnachtsmann ist fertig mit der Auslieferung. Schöne Weihnachten.
10
Der Weihnachtsmann ist fertig mit der Auslieferung. Schöne Weihnachten.
10
Der Weihnachtsmann ist fertig mit der Auslieferung. Schöne Weihnachten.
10
Der Weihnachtsmann ist fertig mit der Auslieferung. Schöne Weihnachten.
10
Der Weihnachtsmann ist fertig mit der Auslieferung. Schöne Weihnachten.
10
Der Weihnachtsmann ist fertig mit der Auslieferung. Schöne Weihnachten.
10
Der Weihnachtsmann ist fertig mit der Auslieferung. Schöne Weihnachten.
10
Der Weihnachtsmann ist fertig mit der Auslieferung. Schöne Weihnachten.
10
Der Weihnachtsmann ist fertig mit der Auslieferung. Schöne Weihnachten.
10
Der Weihnachtsmann ist fertig mit der Auslieferung. Schöne Weihnachten.


Eigentlich sollte ab "Der Weihnachtsmann liefert aus:" so eine Ausgabe erfolgen:

Die Tour beginnt:
- Der Weihnachtsmann liefert aus: Geschenk: 1 kg
- Der Weihnachtsmann liefert aus: Geschenk: 11 kg
- Der Weihnachtsmann liefert aus: Geschenk: 15 kg
- Der Weihnachtsmann liefert aus: Geschenk: 12 kg
- Der Weihnachtsmann liefert aus: Geschenk: 4 kg
- Der Weihnachtsmann liefert aus: Geschenk: 2 kg
- Der Weihnachtsmann liefert aus: Geschenk: 1 kg
- Der Weihnachtsmann liefert aus: Geschenk: 19 kg
- Der Weihnachtsmann liefert aus: Geschenk: 14 kg
- Der Weihnachtsmann liefert aus: Geschenk: 6 kg
Der Weihnachtsmann ist fertig mit der Auslieferung. Schöne Weihnachten.


___________________________________________________________________________________

Java:
for (int i = 0; i < arraygroesseGeschenke; i++) {
            derWeihnachtsmann.naechstesGeschenkAusliefern();
Es muss ein Problem in der Schleife oder in der Methode naechstesGeschenkAusliefern() geben...
Java:
  public void naechstesGeschenkAusliefern() {
        if (this.schlitten.istLeer()) {
            System.out.println("Der Weihnachtsmann ist fertig mit der "
                + "Auslieferung. Schöne Weihnachten.");
        } else {
            System.out.println(this.schlitten.getNaechstesGeschenk().
                getGewicht());
        }
    }
Hast/habt ihr zufällig eine Idee?
 

Panzenbaby

Cadet 3rd Year
Dabei seit
Apr. 2017
Beiträge
42
Also erstens, nimmst du nie Geschenke vom Schlitten. Darum bleiben die immer bei 10 (siehe ausgabe). Bei getNaechstesGeschenk könntest du übrigens die sehr hilfreiche Methode System.arrayCoppy verwenden. Was du da machst ist sehr merkwürdig ^^ Hier wäre eigentlich ein Stack besser geeignet.

Code:
public void naechstesGeschenkAusliefern() {
    if (this.schlitten.istLeer()) {
        System.out.println("Der Weihnachtsmann ist fertig mit der Auslieferung. Schöne Weihnachten.");
    } else {
        System.out.println(this.schlitten.getNaechstesGeschenk());
        HIER MUSST DU NOCH DAS GESCHENKT VOM SCHLITTEN NEHMEN
    }
}
Außerdem ist bei kannNochFuettern der Wurm drinnen. Anscheinend kannst du nie füttern. Da du Geschenk und
Rentier nicht gepostet hast, kann ich nicht nachvollziehen was da nicht stimmt.
 

funktionierdoch

Cadet 2nd Year
Ersteller dieses Themas
Dabei seit
Dez. 2018
Beiträge
19
Aber sobald ich die Methode getNaechstesGeschenk() aufrufe wird mir doch das oberste,also [0], als Geschenk ausgegeben und der Rest rückt dann eine Position nach unten. (btw. System.arrayCopy dürfen wir leider nicht verwenden.) Wieso muss ich da extra noch ein Geschenk entnehmen?
Oh ja tut mir Leid ich poste eben die restlichen Sachen:

Klasse Rentier:
Java:
package de.weihnachten;

public class Rentier extends GewichtigesWeihnachtsObjekt {
    private double hunger;
   
    public Rentier() {
        super(XMasUtils.getZufallsGanzzahl(200, 300));
        this.hunger = (XMasUtils.getZufallHunger(1.0, 2.0));
    }
    
 
    public double getHunger() {
        return hunger;
    }
    
    public double getHunger(double gGewicht) {
        double anzEssensrationen = hunger + (0.01 * gGewicht);
        return anzEssensrationen;
    }
    
    public String asString( ) {
        return " - Ich bin ein Rentier mit indiv. Hunger "
            + Double.toString(this.hunger) + " und Gewicht "
                + Integer.toString(this.getGewicht()) + " kg"; 
    }
    
    
    
    
    public static void main(String[] args) {
        
    }
}
Klasse Geschenk:
Java:
package de.weihnachten;

public class Geschenk extends GewichtigesWeihnachtsObjekt {
    
    public Geschenk() {
        super(XMasUtils.getZufallsGanzzahl(1, 20));
    }

    public String asString() {
        return "Geschenk: " + Integer.toString(this.getGewicht()) + "kg.";
    }
    
    
    
    
    
    
    public static void main(String[] args) {
        
    }
}
Ich komme irgendwie nicht drauf.:freak:
 

Panzenbaby

Cadet 3rd Year
Dabei seit
Apr. 2017
Beiträge
42
Code:
public Geschenk getNaechstesGeschenk() {
Geschenk[] temp = new Geschenk[this.geschenke.length];

    temp[0] = this.geschenke[0];

    for (int i = 1; i < temp.length; i++) {
        temp[i] = this.geschenke[i];
    }
    for (int i = 0; i < temp.length; i++) {
    this.geschenke[i] = temp[i];
    }

    return temp[0];
}
Du kopierst eigentlich nur geschenke nach tmp, dann tmp nach geschenke (unnötig) und gibst dann das erste zurück. Da rutscht nichts raus. das wäre auch falsch, da du die methode noch wo anders aufrufst

Edit:
kannNochFuettern scheint doch ok zu sein. Du gibst dem guten nur zu wenig Futter mit glaube ich. Bin mir aber nicht sicher
 
Zuletzt bearbeitet:
Top