Problem mit for schleife/ try-catch block

EinMensch

Mitglied
Hallo allerseits!

Ich bin Anfänger, was Java angeht, und ich habe ein Problem mit einem Code, den ich erstellt habe: Er funktioniert nicht.

Also, es geht um folgendes: Ich habe 3 Silos mit unterschiedlichen Zementbestandteilen. Wöchentlich werden aus den Silos unterschiedliche Anteile entnommen.
Ich soll ein Programm erstellen, was die Silos und die Entnahme pro Woche simuliert und ausgibt, wann ein Silo nach X Wochen aufgefüllt werden muss (unter 20% bei 40m³ Gesamtvolumen).

Bisher hab ich es so gelöst:

2 Packages, eines mit der main, eines mit 5 Klassen: Eine abstrakte (Elternklasse) Silo, davon drei abgeleitete Kindklassen (Silo 1, Silo 2, Silo 3; sie unterscheiden sich geringfügig), die abhängig von der aktuellen Woche den jeweiligen Füllstand berechnen.
Die 5. Klasse ist eine Exception (die funktioniert).

Mein eigentliches Problem ist in der main methode. Ich habe einen try-catch block, der so aussieht:

Java:
try {
for (int i = 0; i < 10; i++) {

a.setWoche(i); //a ist Silo A
b.setWoche(i);
c.setWoche(i);

}
} catch (NachfuellBedarf e) { //Nachfuellbedarf ist die Eception Klasse
System.out.println(e.getMessage());
System.out.println("Nach " + i + " Wochen.");

}

Die set Methode bezieht sich auf einen int i, der oben erzeugt wurde. Ich habe nicht so die Ahnung von Set Methoden, aber diese hier bezieht sich auf folgendes in der jeweiligen Silo Kindklasse:


public void setWoche(double Fuellstand2) throws NachfuellBedarf {
this.Fuellstand2 = Fuellstand2;

Java:
if (berechneFuellstandA() <= 20) {
throw new NachfuellBedarf("Der Fuellstand in Silo A beträgt "
					+ berechneFuellstandA());
}

Mein Problem ist scheinbar, dass die Schleife nicht funktioniert - Wenn ich auf run klicke, gibt das Programm kein Ergebnis aus. Ändere ich den Wert 20 (% Füllstand) aber auch etwas über 100, gibt er mir den Wert nach einer Woche aus (67,5%), hört dann auch auf... Wahrscheinlich braucht ihr mehr Infos, aber hier alles reinzukopieren würde den Rahmen sprengen, oder?
Sorry für meine schlechten Kenntnisse, bin Anfänger. Über Tipps währe ich sehr dankbar!
 
Okay, ich poste einfach mal die Klasse Silo:

Java:
 package anteile;

abstract public class Silo {
	protected double GesamtVolumen;
	protected double EntnahmeAnteilHR;
	protected double EntnahmeAnteilL;
	protected double EntnahmeAnteilB;

	public Silo(double GesamtVolumen,
			double EntnahmeAnteilHR, double EntnahmeAnteilL,
			double EntnahmeAnteilB) {
		this.GesamtVolumen = GesamtVolumen;
		this.EntnahmeAnteilHR = EntnahmeAnteilHR;
		this.EntnahmeAnteilL = EntnahmeAnteilL;
		this.EntnahmeAnteilB = EntnahmeAnteilB;
	}
	
	
}



Und noch die Klasse SiloA: Das Silo besteht aus 2 Füllkammern mit jeweils 40m³ Volumen.

Java:
package anteile;

public class SiloA extends Silo {
	private double Fuellstand1 = 100;
	private double Fuellstand2 = 100;

	public SiloA(double GesamtVolumen, double EntnahmeAnteilHR,
			double EntnahmeAnteilL, double EntnahmeAnteilB,
			double berechneFuellstand1, double Fuellstand2) {
		super(GesamtVolumen, EntnahmeAnteilHR, EntnahmeAnteilL, EntnahmeAnteilB);
		this.Fuellstand1 = Fuellstand1;
		this.Fuellstand2 = Fuellstand2;

	}

	public double berechneEntnahmeA() {
		return (5 * this.EntnahmeAnteilHR) + (25 * this.EntnahmeAnteilL)
				+ (32 * this.EntnahmeAnteilB);

	}

	public double berechneFuellstandA() {
		return (this.GesamtVolumen - (this.berechneEntnahmeA())) * 100
				/ this.GesamtVolumen;
	}

	public double Fuellstand1() {
		if (berechneFuellstandA() > 50) {
			return (this.GesamtVolumen / 2 - (this.GesamtVolumen - this
					.berechneFuellstandA())) * 100 / 40;

		} else {
			return 0;
		}
	}

	public double Fuellstand2() {
		if (berechneFuellstandA() < 50) {
			return (this.GesamtVolumen / 2 - (this.GesamtVolumen - this
					.berechneFuellstandA())) * 100 / 40;

		} else {
			return 100;
		}
	}

	public void setWoche(double Fuellstand2) throws NachfuellBedarf {
		this.Fuellstand2 = Fuellstand2;

		if (berechneFuellstandA() <= 20) {
			throw new NachfuellBedarf("Der Fuellstand in Silo A beträgt "
					+ berechneFuellstandA());
		}

	}

}
 
müsstest den Code vllt. noch verbessern z.B. ungenutzte Variablen, Methoden, teilweise verwirrend.
Fachlogik in Exceptions behandeln finde ich auch nicht so günstig.

Zum Problem:
Die Methode setWoche hat den falschen Parameter (wird auch nicht verwendet) und
in der Berechnungsmethode bleibt der Wert auf Gesamtvolumen - 1*Abnahmemenge stehen,deshalb keine Ausgabe.

mögliche Lösung:

Java:
private int woche;

public void setWoche(int woche)
{
   this.woche = woche;
   ...
   ...
}

public double berechneFuellstandA()
{
   return (this.GesamtVolumen - (this.berechneEntnahmeA()*this.woche)) * 100 / this.GesamtVolumen;
}
 
Zuletzt bearbeitet:
Also die Schleife läuft nicht aufgrund eines falschen Parameters? Hm... Aber wie könnte ich die Schleife aufbauen? Wenn ichs so versuche wie du bekomm ich einen unreachable code...

Trotzdem danke!

Übrigens hier meine main methode...

Java:
 package anwendung;

import anteile.NachfuellBedarf;
import anteile.SiloA;
import anteile.SiloB;
import anteile.SiloC;

public class Anwendung {
	private static int i;

	public static void main(String[] arqs) {
		SiloA a = new SiloA(80, 0.20, 0.80, 0.10, 100, 100);
		SiloB b = new SiloB(40, 0.45, 0.20, 0.20, 100);
		SiloC c = new SiloC(40, 0.70, 0.0, 0.35, 100);

		try {
			for (int i = 0; i < 10; i++) {

				a.setWoche(i);
				b.setWoche(i);
				c.setWoche(i);

			}
		} catch (NachfuellBedarf e) {
			System.out.println(e.getMessage());
			System.out.println("Nach " + i + " Wochen.");

		}
	}
}
 
Der Methode setWoche wird ein int Wert übergeben (die laufende Woche) aber die Methode erwartet
einen double-Wert (Füllstand). Also vom Datentyp und auch inhaltlich nicht passend. Das meinte ich mit falschen Parameter.

Ausserdem ist in der Klasse Anwendung die Variable i doppelt definiert einmal oben als static und lokal in der Schleife.

Habe mal die relevanten Klassen geändert.

Java:
public class SiloA extends Silo {
    
    private int woche;
    public SiloA(double GesamtVolumen, double EntnahmeAnteilHR,
            double EntnahmeAnteilL, double EntnahmeAnteilB,
            double berechneFuellstand1, double Fuellstand2) {
        super(GesamtVolumen, EntnahmeAnteilHR, EntnahmeAnteilL, EntnahmeAnteilB);
    }
 
    public double berechneEntnahmeA() {
        return (5 * this.EntnahmeAnteilHR) + (25 * this.EntnahmeAnteilL)
                + (32 * this.EntnahmeAnteilB);
 
    }
 
    public double berechneFuellstandA() {
    	return (this.GesamtVolumen - (this.berechneEntnahmeA()*this.woche)) * 100 / this.GesamtVolumen;
    }
 
    public void setWoche(int woche) throws NachfuellBedarf 
    {
        this.woche = woche;     
        double  fs = berechneFuellstandA();      
        System.out.println("fs="+fs);       
        if (fs <= 20) {
            throw new NachfuellBedarf("Der Fuellstand in Silo A beträgt "
                    + berechneFuellstandA());
        }
    }
}
Java:
public class Anwendung {
    
    public static void main(String[] arqs) {
        SiloA a = new SiloA(80, 0.20, 0.80, 0.10, 100, 100);
        int i = 0;
        try {
            for (i = 0; i < 10; i++) {
 
            	System.out.println("i="+i);
                a.setWoche(i);
            
 
            }
        } catch (NachfuellBedarf e) {
        	
            System.out.println(e.getMessage());
            System.out.println("Nach " + i + " Wochen.");
 
        }
    }
}
 
Zuletzt bearbeitet:
Vielen Dank, es klappt jetzt einigermaßen! Noch ein bisschen Feinschliff und fertig, jetzt verstehe ich auch meinen Fehler und die Lösung. Merci
 
Übrigens würde ich wärmstens empfehlen, [c]NachfuellBedarf[/c] in [c]NachfuellBedarfException[/c] o. ä. umzubenennen. Exceptions haben eine Sonderstellung und sollten deshalb als solche erkennbar sein.
 

Zurück
Oben