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).
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:
publicbooleanistKleiner(Vergleichbar other){if(other instanceofTarif){if(tarif<((Tarif)other).getTarif()){returntrue;}<---------------------------hier erwartet der compiler ein return statement
else{returnfalse;}}returnfalse;}
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^^
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:
publicclassTarifRechner{// Array von Tarifen verschiedener StromanbieterprivateTarif[] tarife;/*
* Konstruktor zur Initialisierung der Tarife.
*
* Parameter: Tarife[] tarife - Array von Tarifen
*/publicTarifRechner(Tarif[] tarife){this.tarife = tarife;}publicTarifgetBestTarif(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];}elseif(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:
publicclassDemoTarifRechner{publicstaticvoidmain(String[] args){// Tarife Tarif[] tarife ={newEPrimo("EPrimo",500.0),newNuon("Nuon",529.0),newVattenfall("Vattenfall",499.0)};// TarifrechnerTarifRechner tr =newTarifRechner(tarife);// Einlesen des monatlichen Verbrauchs von der Kommandozeiledouble verbrauch =Double.parseDouble(args[0]);// Ermittlung des konstenguenstigten TarifsTarif bestTarif = tr.getBestTarif(verbrauch);// AusgabeSystem.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?
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:
publicclassDemoTarifRechner{publicstaticvoidmain(String[] args){// Tarife Tarif[] tarife ={newEPrimo("EPrimo",500.0),newNuon("Nuon",529.0),newVattenfall("Vattenfall",499.0)};// TarifrechnerTarifRechner tr =newTarifRechner(tarife);// Einlesen des monatlichen Verbrauchs von der Kommandozeiledouble verbrauch =Double.parseDouble(args[0]);// Ermittlung des konstenguenstigten TarifsTarif bestTarif = tr.getBestTarif(verbrauch);// AusgabeSystem.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..
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
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
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
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:
publicstaticvoidmain(String[] args){// Tarife Tarif[] tarife ={newEPrimo("EPrimo",500.0),newNuon("Nuon",529.0),newVattenfall("Vattenfall",499.0)};// TarifrechnerTarifRechner tr =newTarifRechner(tarife);// Einlesen des monatlichen Verbrauchs von der Kommandozeiledouble verbrauch =Double.parseDouble(args[0]);// Ermittlung des konstenguenstigten TarifsTarif bestTarif = tr.getBestTarif(verbrauch);// AusgabeSystem.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:
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..