Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
hallo, ich bin dabei einen Tarifrechner zu programmieren, der dann übergebene Stromtarife von verschiedenen Anbietern vergleicht.. beim Compilen.. ergibt sich jedoch folgender Fehler...
Der Fehler aus Zeile 50 entspricht hier der Zeile mit dem else... Da ich mehrere Klassen in verschiedenen Dateien programmiert haben, habe ich nur den Ausschnit hier gepostet...
Ich habe mich natürlich auch über den Fehler informiert, aber.. hier sind doch alle möglichkeiten abgedeckt und es gibt immer nen Return... wo liegt denn der Fehler...?
Kann man machen, muss man aber nicht. Bei Eclipse z.B. kann man sich eine Warnung ausgeben lassen, wenn ein return unnötigerweise in einem else-Block ist, obwohl es ohne else auch gereicht hätte. Das
Code:
return false
hier in Zeile 12 müsste eigentlich ausreichen, so dass, auch wenn kein if-Block beschritten wurde, auf jeden Fall etwas zurückgegeben wird.
beim else verlangt er ein return statement.. nun las ich aber auch.. dass es ja sein "könnte", dass weder if noch else erfüllt werden.. und am ende vor der letzten bracket ein return stehen muss... in dem fall würde aber ein unreachable fehler kommen...
Kann man machen, muss man aber nicht. Bei Eclipse z.B. kann man sich eine Warnung ausgeben lassen, wenn ein return unnötigerweise in einem else-Block ist, obwohl es ohne else auch gereicht hätte. Das
Code:
return false
hier in Zeile 12 müsste eigentlich ausreichen, so dass, auch wenn kein if-Block beschritten wurde, auf jeden Fall etwas zurückgegeben wird.
Ja, eigentlich mach ich das auch immer so. Ich wüsste aber nicht, woran es sonst liegen könnte.. (außer, das return ist wirklich groß geschrieben (was aber nach dem letzten post nicht der fall zu sein scheint))
Ich hab deinen Code gerade mal genommen und ein wenig verändert. Die Struktur mit den ifs und elses wurde beibehalten, ich hab nur mal die Abfragen entsprechend zu irgendwas anderem geändert, um zu gucken, ob es sich kompilieren lässt (Code ergibt also keinen Sinn, ich habe ja keine Klasse Tarif etc., soll nur verdeutlichen, dass es geht).
Java:
public class KleinerAls {
public boolean istKleiner(int other){
if(other<10){
if(other<5){
return true;
}
else{
return false;
}
}
return false;
}
}
Das lässt sich bei mir anstandslos kompilieren.
Edit:
Zu deinem zweiten Beispiel: Mit dem unreachable statement hattest du ein Konstrukt wie dieses hier, oder?
Das letzte return false kann niemals erreicht werden, weil immer das return false aus dem else-Block genommen wird, wenn die if-Bedingung nicht erfüllt ist. Es ist toter Code und das streicht dir der Compiler an.
.. bei mir nicht... hä? (bezieht sich aufs compilieren, das mit dem toten code.. ja das macht sinn.. wollt nur zeigen, dasss ich alles probiert hab
das hängt doch aber auch nicht von den anderen sourcecodes ab.. oder?
Java:
public boolean istKleiner(Vergleichbar other){
if(other instanceof Tarif){
if(tarif<((Tarif)other).getTarif()){
return true;
} <---------------------------hier erwartet der compiler ein return statement
else{
return false;
}
}
return false;
}
genauso steht die Methode bei mir im Editor...
zur Info.. ich arbeite mit abstrakten Klassen usw.. verebung, interface .. joa aber das dürfte sich ja nicht auswirken..
Ich weiß nicht, ob es nicht doch von irgendwas anderem im Rest deines Codes abhängen könnte, deshalb hab ich die oben gepostete Klasse KleinerAls mit der Methode istKleiner() geschrieben, weil sie unabhängig von deinem Code ist. Hast du mal probiert, die zu kompilieren?
Hm, seltsam, das klappt dann, hängt also wohl doch vom Rest des Codes ab.. ich bin mal so frei zumindest die Datei in dem die Methode steht zu posten.. vllt findet sich ja wer, der es überfliegt^^
Java:
public abstract class Tarif implements Vergleichbar{
private double grundpreis;
private double kwh;
private double tarif;
private String name;
public double getGrundpreis(){
return grundpreis;
}
public double getKwh(){
return kwh;
}
public double getTarif(){
return tarif;
}
public String getName(){
return name;
}
public void setGrundpreis(double grundpreis){
this.grundpreis =grundpreis;
}
public void setKwh(double kwh){
this.kwh=kwh;
}
public void setTarif(double tarif){
this.tarif=tarif;
}
public void setName(String name){
this.name=name;
}
public Tarif(String name, double grundpreis){
this.kwh=0.0;
this.tarif=grundpreis;
this.name=name;
this.grundpreis=grundpreis;
}
public abstract void berechneTarif(double kwh);
public boolean istKleiner(Vergleichbar other){
if(other instanceof Tarif){
if(tarif<((Tarif)other).getTarif()){
return true;
}
else{
return false;
}
}
return false;
}
}
UND dies ist die Klasse, mit der ich meine Programmierung testen soll.. beim compilieren dieses programms gibt es die fehlermeldung..
Java:
public class DemoTarifRechner {
public static void main(String[] args) {
// Tarife
Tarif[] tarife = {
new EPrimo("EPrimo", 500.0),
new Nuon("Nuon", 529.0),
new Vattenfall("Vattenfall", 499.0)
};
// Tarifrechner
TarifRechner tr = new TarifRechner(tarife);
// Einlesen des monatlichen Verbrauchs von der Kommandozeile
double verbrauch = Double.parseDouble(args[0]);
// Ermittlung des konstenguenstigten Tarifs
Tarif bestTarif = tr.getBestTarif(verbrauch);
// Ausgabe
System.out.print("Guenstigter Tarif bei einem Verbrauch von ");
System.out.println(verbrauch + " kwh:");
System.out.println("Anbieter: " + bestTarif.getName());
System.out.println("Tarif : " + bestTarif.getTarif() + " Cent");
}
}
dann gibt es natürlich noch die Stromanbieter, 3 an der Zahl.. alle in dieser Form..
Java:
public EPrimo(String name, double grundpreis) {
super(name, grundpreis);
}
public void berechneTarif(double kwh) {
setKwh(kwh);
setTarif(getGrundpreis() + 20.0*kwh);
}
}
das interface, welches der Tarif implementiert.. ist folgendes
Ich bezog mich nur auf die Fom des Rückgabewertes. Underscores sind tatsächlich nicht elegenat (in Java). Mir persönlich graut es auch vor "Denglish" im Quellcode.
darum ging es auch nicht . also ich hab hier grad durchgescrollt und eigentlich nur auf die Lösung gewartet. Finde sowas mit if/else zu lösen ist mehr als hässlich. Wenn es kein boolean ist nimmt man eben den ternären operator.
Hey hey, nun beruhigt euch mal. Ich hab die Methode doch nur istKleiner_Unsinn() genannt, um sie von der istKleiner()-Methode abzugrenzen. "Unsinn" deshalb, weil sie in der von mir beschriebenenen Form zu einem "unreachable statement" führt, und der Unterstrich diente dazu, damit es nicht aussieht wie "kleiner Unsinn" Das Denglish hab ich halt einfach mitübernommen
Aber ich glaube, dem Threadersteller ist es keine große Hilfe, wenn darüber diskutiert wird, ob jetzt ein Einzeiler oder if-Blöcke schöner sind.
so.. es ist mir ja ein bisschen peinlich aber es lag daran, dass ich in der falschen Datei gesucht habe...
mea culpa...
aber ich habe eure diskussion überlesen.. und joa.. verinnerlicht.
Nun hat sich jedoch ein neues Problem ergeben:
Code:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
und zwar im rahmen dieser sourcecodes (ich poste mal zwei da die zusammenhängen
Java:
public class TarifRechner {
// Array von Tarifen verschiedener Stromanbieter
private Tarif[] tarife;
/*
* Konstruktor zur Initialisierung der Tarife.
*
* Parameter: Tarife[] tarife - Array von Tarifen
*/
public TarifRechner(Tarif[] tarife) {
this.tarife = tarife;
}
public Tarif getBestTarif(double verbrauch){
tarife[0].berechneTarif(tarife[0].getKwh());
tarife[1].berechneTarif(tarife[1].getKwh());
tarife[2].berechneTarif(tarife[2].getKwh());
if(tarife[0].getTarif()<tarife[1].getTarif() && tarife[0].getTarif()<tarife[2].getTarif()){
return tarife[0];
}
else if(tarife[1].getTarif()<tarife[0].getTarif() && tarife[1].getTarif()<tarife[2].getTarif()){
return tarife[1];
}
else{
return tarife[2];
}
}
}
und hier die Testklasse.. bei der dann der Fehler auftritt... laut zeilenanzeige würde das hier zeile 37 entsprechen, da wo der Kommentar Ausgabe steht
Java:
public class DemoTarifRechner {
public static void main(String[] args) {
// Tarife
Tarif[] tarife = {
new EPrimo("EPrimo", 500.0),
new Nuon("Nuon", 529.0),
new Vattenfall("Vattenfall", 499.0)
};
// Tarifrechner
TarifRechner tr = new TarifRechner(tarife);
// Einlesen des monatlichen Verbrauchs von der Kommandozeile
double verbrauch = Double.parseDouble(args[0]);
// Ermittlung des konstenguenstigten Tarifs
Tarif bestTarif = tr.getBestTarif(verbrauch);
// Ausgabe
System.out.print("Guenstigter Tarif bei einem Verbrauch von ");
System.out.println(verbrauch + " kwh:");
System.out.println("Anbieter: " + bestTarif.getName());
System.out.println("Tarif : " + bestTarif.getTarif() + " Cent");
}
}
weshalb fliegt er denn aus dem Array... vorallem bei 0 ?
es wird doch am anfang der Testklasse ein Array mit 3 "Stromanbietern" gefüllt.. also müssten doch 0 1 und 2 im array existieren?
Ich blicke nicht ganz durch. Du schreibst, der Fehler würde hier bei Zeile 37 angezeigt, wo der Kommentar "Ausgabe" steht. Wenn da aber nur der Kommentar steht, kann da ja nicht der Fehler liegen
Ich vermute, du meinst Zeile 34, wo auf die Methode getBestTarif() zugegriffen wird, die mit dem Array rummacht. Wo genau gibt's denn da jetzt die ArrayIndexOutOfBoundsException?
Spricht was dagegen, die Array-Initialisierung testweise mal so zu machen?
Java:
Tarif[] tarife = new Tarif[3];
tarife[0] = new EPrimo("EPrimo", 500.0);
tarife[1] = new Nuon("Nuon", 529.0);
tarife[2] = new Vattenfall("Vattenfall", 499.0);
Vielleicht geht auch was bei der Referenzweitergabe beim Konstruktor von TarifRechner schief… keine Ahnung :rtfm:
laut console (in meinen fall zeile 19) ist das beim Kommentar.. is mir auch.. ein rätsel.. aber vllt weiß java es nur nicht genauer...
und ja ich denke auch, dass es irgendwo da passieren muss wo sie, wie du sagst "rummachen"
naja ich hab die fehlermeldung ja gepostet.. also laut console gibt es den Fehler schon beim Index 0
testweise könnte ich deine Arrayerzeugung ma probieren, aber an und für sich "darf" ich die Testklasse nicht verändern. müsste also irgendwie auch so gehen
EDIT
auch wenn ich das Array nach deinem Vorschlag erzeuge gibts den selben Fehler... allerdings steht der fehler dann in einer Zeile (laut konsole) in der schon längst nix mehr steht...???:L
Hm, was mich auch wundert, ist... dass ich gar nicht erst dazu komme Werte für den Verbrauch (Stromverbrauch) einzugeben..
ich kann compilieren, aber dann beim java ... kommt der fehlr.. also muss der fehler doch schon vorher auftreten
Java:
public class DemoTarifRechner {
public static void main(String[] args) {
// Tarife
Tarif[] tarife = {
new EPrimo("EPrimo", 500.0),
new Nuon("Nuon", 529.0),
new Vattenfall("Vattenfall", 499.0)
};
// Tarifrechner
TarifRechner tr = new TarifRechner(tarife);
// Einlesen des monatlichen Verbrauchs von der Kommandozeile
double verbrauch = Double.parseDouble(args[0]);
// Ermittlung des konstenguenstigten Tarifs
Tarif bestTarif = tr.getBestTarif(verbrauch);
// Ausgabe
System.out.print("Guenstigter Tarif bei einem Verbrauch von ");
System.out.println(verbrauch + " kwh:");
System.out.println("Anbieter: " + bestTarif.getName());
System.out.println("Tarif : " + bestTarif.getTarif() + " Cent");
}
}
Da ich ja gar nicht bis zum Einlesen komme muss es wohl hier irgendwas.. geben..
Java:
// Tarife
Tarif[] tarife = {
new EPrimo("EPrimo", 500.0),
new Nuon("Nuon", 529.0),
new Vattenfall("Vattenfall", 499.0)
};
// Tarifrechner
TarifRechner tr = new TarifRechner(tarife);
aber kann man aus dem Arrray fliegen wenn man ein Array füllt?
bzw wenn einen neuen TarifRechner initialisiert??
hier nochmal der TarifRechner
Java:
public class TarifRechner {
// Array von Tarifen verschiedener Stromanbieter
private Tarif[] tarife;
/*
* Konstruktor zur Initialisierung der Tarife.
*
* Parameter: Tarife[] tarife - Array von Tarifen
*/
public TarifRechner(Tarif[] tarife) {
this.tarife = tarife;
}
public Tarif getBestTarif(double verbrauch){
tarife[0].berechneTarif(tarife[0].getKwh());
tarife[1].berechneTarif(tarife[1].getKwh());
tarife[2].berechneTarif(tarife[2].getKwh());
if(tarife[0].getTarif()<tarife[1].getTarif() && tarife[0].getTarif()<tarife[2].getTarif()){
return tarife[0];
}
else if(tarife[1].getTarif()<tarife[0].getTarif() && tarife[1].getTarif()<tarife[2].getTarif()){
return tarife[1];
}
else{
return tarife[2];
}
}
}
was ist denn das hier für eine Ansammlung von undurchsichten Posts und Codes?
wie lautet die aktuelle Fehlermeldung/ das Problem? auf die Schnelle gar nicht zu finden,
Code von 10 Postings zusammenzukopieren ist auch nicht grad schön, mach es bitte wie folgt, alles zusammen,
das ganze kann dann jeder kopieren, in eine Klasse Test einfügen, Run, läuft,
nur bei dir vielleicht bisschen komplizierter, weil alle Klassen schon vorhanden sind, in einem separaten Projekt aber bestimmt auch möglich,
Klassen vielleicht nicht alle die aktuellesten, von erste Seite des Threads zusammenkopiert,
fehlende Klassen wie Vattenfall selber kopiert
Java:
public class Test
{
public static void main(String[] args)
{
DemoTarifRechner.main(new String[] {"4"});
}
}
class DemoTarifRechner
{
public static void main(String[] args)
{
// Tarife
Tarif[] tarife =
{
new EPrimo("EPrimo", 500.0),
new Nuon("Nuon", 529.0),
new Vattenfall("Vattenfall", 499.0)
};
// Tarifrechner
TarifRechner tr = new TarifRechner(tarife);
// Einlesen des monatlichen Verbrauchs von der Kommandozeile
double verbrauch = Double.parseDouble(args[0]);
// Ermittlung des konstenguenstigten Tarifs
Tarif bestTarif = tr.getBestTarif(verbrauch);
// Ausgabe
System.out.print("Guenstigter Tarif bei einem Verbrauch von ");
System.out.println(verbrauch + " kwh:");
System.out.println("Anbieter: " + bestTarif.getName());
System.out.println("Tarif : " + bestTarif.getTarif() + " Cent");
}
}
class EPrimo
extends Tarif
{
public EPrimo(String name, double grundpreis)
{
super(name, grundpreis);
}
public void berechneTarif(double kwh)
{
setKwh(kwh);
setTarif(getGrundpreis() + 20.0 * kwh);
}
}
class Nuon
extends Tarif
{
public Nuon(String name, double grundpreis)
{
super(name, grundpreis);
}
public void berechneTarif(double kwh)
{
setKwh(kwh);
setTarif(getGrundpreis() + 20.0 * kwh);
}
}
class Vattenfall
extends Tarif
{
public Vattenfall(String name, double grundpreis)
{
super(name, grundpreis);
}
public void berechneTarif(double kwh)
{
setKwh(kwh);
setTarif(getGrundpreis() + 20.0 * kwh);
}
}
interface Vergleichbar
{
abstract boolean istKleiner(Vergleichbar other);
}
abstract class Tarif
implements Vergleichbar
{
private double grundpreis;
private double kwh;
private double tarif;
private String name;
public double getGrundpreis()
{
return grundpreis;
}
public double getKwh()
{
return kwh;
}
public double getTarif()
{
return tarif;
}
public String getName()
{
return name;
}
public void setGrundpreis(double grundpreis)
{
this.grundpreis = grundpreis;
}
public void setKwh(double kwh)
{
this.kwh = kwh;
}
public void setTarif(double tarif)
{
this.tarif = tarif;
}
public void setName(String name)
{
this.name = name;
}
public Tarif(String name, double grundpreis)
{
this.kwh = 0.0;
this.tarif = grundpreis;
this.name = name;
this.grundpreis = grundpreis;
}
public abstract void berechneTarif(double kwh);
public boolean istKleiner(Vergleichbar other)
{
if (other instanceof Tarif)
{
if (tarif < ((Tarif)other).getTarif())
{
return true;
}
else
{
return false;
}
}
return false;
}
}
class TarifRechner
{
// Array von Tarifen verschiedener Stromanbieter
private Tarif[] tarife;
/*
*
* Konstruktor zur Initialisierung der Tarife.
*
*
* Parameter: Tarife[] tarife - Array von Tarifen
*/
public TarifRechner(Tarif[] tarife)
{
this.tarife = tarife;
}
public Tarif getBestTarif(double verbrauch)
{
tarife[0].berechneTarif(tarife[0].getKwh());
tarife[1].berechneTarif(tarife[1].getKwh());
tarife[2].berechneTarif(tarife[2].getKwh());
if (tarife[0].getTarif() < tarife[1].getTarif() && tarife[0].getTarif() < tarife[2].getTarif())
{
return tarife[0];
}
else if (tarife[1].getTarif() < tarife[0].getTarif() && tarife[1].getTarif() < tarife[2].getTarif())
{
return tarife[1];
}
else
{
return tarife[2];
}
}
}
Ausgabe
Code:
Guenstigter Tarif bei einem Verbrauch von 4.0 kwh:
Anbieter: Vattenfall
Tarif : 499.0 Cent
Programm erwartet einen args-Parameter, wenn der fehlt gibts eine Exception, die Anzahl Parameter wird vorher nicht geprüft
oh das könnte es sein.. vergessenden wert beim befehl mitzu übergeben..
sry, wegen des durcheinanders...
ich hab deinen code mal kopiert und ja es klappt, allerdings soll ich ja mit einer eingabeaufforderung arbeiten bzw darf ich die Dateien nicht einfach zusammenpacken...
es müsste doch auch funktionieren wenn ich einzelne dateien von klassen ahbe, oder?
"Syntaxfehler" ist keine aktzeptable Antwort, weder von einem Programm an dich, noch von dir ans Forum
ist da nichts längeres mit Zeilenangabe? in einer Entwicklungsumgebung irgendwas rot unterstrichen?
ist es überhaupt ein Compilerfehler oder eine Ausgabe bei Ausführung? irgendwelche Infos muss es doch geben,
poste notfalls einen Screenshot, kann man hier in Postings direkt anhängen
wenn du meinen Code verwendest, dann funktioniert
> java DemoTarifRechner <zahl>
nicht, bleib lieber bei deinen
das habe ich in der Tat noch nicht gesehen, oder kann mich nicht erinnern,
du hast nicht zufällig selber im Programm irgendwelche Prüfungen/ try/catch, die Syntaxfehler ausgeben?
<400.0> ist natürlich Käse, die Klammern müssen weg
vielen Dank, ich muss jetzt nur nochmal die Tarifevergleichsfunktion bearbeiten, denn es kommt immer Vattenfall als anbieter heraus und das .. geht ja nich
nicht zurecht, sobald man erstmal ein reales Objekt hat kann man auch immer alle Methoden aufrufen,
es gibt eben Subklassen die die Methode implementieren oder notfalls anonyme innere Klassen, bei der Deklaration wird alles abgesichert
bei ActionListener a = ..; wunder man sich ja auch nicht, warum der Aufruf der actionPerformed()-Methode geht
also.. das problem bei folgendem ist ..einmal brauch ich euch noch. ist allerdings gradnen logisches Problem...
und zwar beim vergleichen der Anbiter.. erhalte ich immer vattenfall... er rechnet immer den Tarif von Nuon aber zum Grundpreis von Vattenfall ... ???:L
so werden die Anbieter eingegeben
Java:
Tarif[] tarife = {
new EPrimo("EPrimo", 500.0),
new Nuon("Nuon", 529.0),
new Vattenfall("Vattenfall", 499.0)
};
es hat mit der Form zu tun, wie die Anbieter programmiert sind...
Java:
public class EPrimo extends Tarif {
public EPrimo(String name, double grundpreis) {
super(name, grundpreis);
}
public void berechneTarif(double kwh) {
setKwh(kwh);
setTarif(getGrundpreis() + 20.0*kwh);
}
}
Dadurch dass sie ja auf die Superklasse zugreifen ist also als letztes der Grundwert des zuletzt eingetragenen Anbieters drin... aber müsste nicht jeder ne eigene superklasse haben..?
wie kann ich es machen, dass für jeden Anbieter ein einzelner Grundpreis da ist.. ( mit vererbung)
so ist der Konstruktor in der Superklasse programmiert
Java:
public Tarif(String name, double grundpreis){
this.kwh=0.0;
this.tarif=grundpreis;
this.name=name;
this.grundpreis=grundpreis;
}
das funktioniert schon, bei mir zumindest wenn ich es mit 400 rechne, nur sind die anderen alle teurer, teils phänomenal,
400*20 bei EPrimo sind allein 8000, da spielt ein Grundpreis von paar Hundert keine Rolle,
logge überall mit System.out.println, was gerechnet wird, und erkläre mit Worten was du eigentlich erwartest
mag ich nun den besten Tarif ermitteln.. wird mir wie gesagt immer Vattenfall empfohlen.. und immer gerechnet grundpreis=499 +20*verbrauch...
hier der Aufruf zum vergleichen..
Java:
public static void main(String[] args) {
// Tarife
Tarif[] tarife = {
new EPrimo("EPrimo", 500.0),
new Nuon("Nuon", 529.0),
new Vattenfall("Vattenfall", 499.0)
};
// Tarifrechner
TarifRechner tr = new TarifRechner(tarife);
// Einlesen des monatlichen Verbrauchs von der Kommandozeile
double verbrauch = Double.parseDouble(args[0]);
// Ermittlung des konstenguenstigten Tarifs
Tarif bestTarif = tr.getBestTarif(verbrauch);
// Ausgabe
System.out.print("Guenstigter Tarif bei einem Verbrauch von ");
System.out.println(verbrauch + " kwh:");
System.out.println("Anbieter: " + bestTarif.getName());
System.out.println("Tarif : " + bestTarif.getTarif() + " Cent");
}
}
Hä?
könnte sich wer bzgl. dieses Problems mir anschließen bisher .. wunder ich mich nur?
ich befürchte ja.. dass einfach alle drei Anbieter irgendwie auf dieselben Attribute zugreifen....
MfG
N.
mit vollständigen Programmen posten ist es bei dir noch nicht weit her, was?
dass für Vattenfall 519 gerechnet ist sehe ich in keiner Form, vielleicht hast du in irgendwelchen Klassen noch irgendwas anders..
mein Test mit aktualisierten Code deines letzten Postings:
Java:
public class Test
{
public static void main(String[] args)
{
DemoTarifRechner.main(new String[]
{"1"});
DemoTarifRechner.main(new String[]
{"100"});
DemoTarifRechner.main(new String[]
{"400"});
DemoTarifRechner.main(new String[]
{"1400"});
}
}
class DemoTarifRechner
{
public static void main(String[] args)
{
// Tarife
Tarif[] tarife =
{new EPrimo("EPrimo", 500.0), new Nuon("Nuon", 529.0), new Vattenfall("Vattenfall", 499.0)
};
// Tarifrechner
TarifRechner tr = new TarifRechner(tarife);
// Einlesen des monatlichen Verbrauchs von der Kommandozeile
double verbrauch = Double.parseDouble(args[0]);
// Ermittlung des konstenguenstigten Tarifs
Tarif bestTarif = tr.getBestTarif(verbrauch);
// Ausgabe
System.out.print("Guenstigter Tarif bei einem Verbrauch von ");
System.out.println(verbrauch + " kwh:");
System.out.println("Anbieter: " + bestTarif.getName());
System.out.println("Tarif : " + bestTarif.getTarif() + " Cent");
}
}
class EPrimo
extends Tarif
{
public EPrimo(String name, double grundpreis)
{
super(name, grundpreis);
}
public void berechneTarif(double kwh)
{
setKwh(kwh);
setTarif(getGrundpreis() + 20.0 * kwh);
}
}
class Nuon
extends Tarif
{
public Nuon(String name, double grundpreis)
{
super(name, grundpreis);
}
public void berechneTarif(double kwh)
{
setTarif(getGrundpreis() + (5 * kwh * kwh) / 1000);
}
}
class Vattenfall
extends Tarif
{
public Vattenfall(String name, double grundpreis)
{
super(name, grundpreis);
}
public void berechneTarif(double kwh)
{
if (kwh < 1000)
{
setTarif(getGrundpreis());
}
if (kwh >= 1000 && kwh < 4000)
{
setTarif(getGrundpreis() + (15 * kwh));
}
if (kwh >= 4000)
{
setTarif(getGrundpreis() + (25 * kwh));
}
}
}
interface Vergleichbar
{
abstract boolean istKleiner(Vergleichbar other);
}
abstract class Tarif
implements Vergleichbar
{
private double grundpreis;
private double kwh;
private double tarif;
private String name;
public double getGrundpreis()
{
return grundpreis;
}
public double getKwh()
{
return kwh;
}
public double getTarif()
{
return tarif;
}
public String getName()
{
return name;
}
public void setGrundpreis(double grundpreis)
{
this.grundpreis = grundpreis;
}
public void setKwh(double kwh)
{
this.kwh = kwh;
}
public void setTarif(double tarif)
{
this.tarif = tarif;
}
public void setName(String name)
{
this.name = name;
}
public Tarif(String name, double grundpreis)
{
this.kwh = 0.0;
this.tarif = grundpreis;
this.name = name;
this.grundpreis = grundpreis;
}
public abstract void berechneTarif(double kwh);
public boolean istKleiner(Vergleichbar other)
{
if (other instanceof Tarif)
{
if (tarif < ((Tarif)other).getTarif())
{
return true;
}
else
{
return false;
}
}
return false;
}
}
class TarifRechner
{
// Array von Tarifen verschiedener Stromanbieter
private Tarif[] tarife;
/*
*
* Konstruktor zur Initialisierung der Tarife.
*
*
* Parameter: Tarife[] tarife - Array von Tarifen
*/
public TarifRechner(Tarif[] tarife)
{
this.tarife = tarife;
}
public Tarif getBestTarif(double verbrauch)
{
tarife[0].berechneTarif(verbrauch);
tarife[1].berechneTarif(verbrauch);
tarife[2].berechneTarif(verbrauch);
System.out.println("0: " + tarife[0].getTarif());
System.out.println("1: " + tarife[1].getTarif());
System.out.println("2: " + tarife[2].getTarif());
if (tarife[0].getTarif() < tarife[1].getTarif() && tarife[0].getTarif() < tarife[2].getTarif())
{
return tarife[0];
}
else if (tarife[1].getTarif() < tarife[0].getTarif() && tarife[1].getTarif() < tarife[2].getTarif())
{
return tarife[1];
}
else
{
return tarife[2];
}
}
}
Ausgabe:
Code:
0: 520.0
1: 529.005
2: 499.0
Guenstigter Tarif bei einem Verbrauch von 1.0 kwh:
Anbieter: Vattenfall
Tarif : 499.0 Cent
0: 2500.0
1: 579.0
2: 499.0
Guenstigter Tarif bei einem Verbrauch von 100.0 kwh:
Anbieter: Vattenfall
Tarif : 499.0 Cent
0: 8500.0
1: 1329.0
2: 499.0
Guenstigter Tarif bei einem Verbrauch von 400.0 kwh:
Anbieter: Vattenfall
Tarif : 499.0 Cent
0: 28500.0
1: 10329.0
2: 21499.0
Guenstigter Tarif bei einem Verbrauch von 1400.0 kwh:
Anbieter: Nuon
Tarif : 10329.0 Cent
> ich befürchte ja.. dass einfach alle drei Anbieter irgendwie auf dieselben Attribute zugreifen....
denkbar wäre es wenn du Fehler eingebaut hast, z.B. die Attribute static..