missing return statement

tentigo

Mitglied
hallo, ich bin dabei einen Tarifrechner zu programmieren, der dann übergebene Stromtarife von verschiedenen Anbietern vergleicht.. beim Compilen.. ergibt sich jedoch folgender Fehler...
Code:
.\TarifRechner.java:50: missing return statement
        }
        ^
1 error

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...?
Code:
public boolean istKleiner(Vergleichbar other){

		if(other instanceof Tarif){
			if(tarif<((Tarif)other).getTarif()){
				return true;
			}
			else{
				return false;
			}
		}
	
		return false;


	}

Vielen Dank für Hinweise,

MfG
N.
 
Zuletzt bearbeitet:

Haave

Top Contributor
Du weißt aber schon, dass
Code:
return
in Kleinbuchstaben zu schreiben ist? (Das ist btw das Syntaxhighlighting für SQL-Code ;))
 

darekkay

Bekanntes Mitglied
pack noch ein else für das erste if dazu. also if-(if-else)-else, und bei jedem muss ein return stehen.

EDIT: oh ja, mach erstmal die returns klein ^^
 

Haave

Top Contributor
pack noch ein else für das erste if dazu. also if-(if-else)-else, und bei jedem muss ein return stehen.
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.
 

tentigo

Mitglied
hm gut.. jetzt kommt ein else without if fehler...

ich machs mal so wie ichs von anfing an machen würde.. (wurde erst so verkettet beim suchen nach einer Lösung...)

Code:
	public boolean istKleiner(Vergleichbar other){

		if(other instanceof Tarif && tarif<((Tarif)other).getTarif()){
			return true;
		}	
		else{
			return false;
		}

	}

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...

Bitte bitte helft mir das zu verstehen^^

MfG
N.
 

darekkay

Bekanntes Mitglied
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))
 

Haave

Top Contributor
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?
Java:
public boolean istKleiner_Unsinn(int other){
	if(other<10 && other<5){
		return true;
	}
	else {
		return false;
	}
	return false;
}

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.
 
Zuletzt bearbeitet:

tentigo

Mitglied
.. 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..

also ich stehe echt auf dem Schlauch...

MfG
N.
 

Haave

Top Contributor
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?
 

tentigo

Mitglied
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
Java:
interface Vergleichbar {
	abstract boolean istKleiner(Vergleichbar other);
	}
MfG
N.
 
Zuletzt bearbeitet:

L-ectron-X

Gesperrter Benutzer
Das hier ist doch umständlich und überflüssig:
Java:
public boolean istKleiner_Unsinn(int other){
	if(other<10 && other<5){
		return true;
	}
	else {
		return false;
	}
	return false;
}


Diese Variante macht genau das gleiche und ist zudem besser zu lesen/verstehen.
Java:
public boolean istKleinerUnsinn(int other){
	if(other<10 && other<5){
		return true;
	}

	return false;
}
 

turing

Mitglied
Also dann fänd ich das hier eleganter. Aber so manch einer findet natürlich die if-else-Blöcke sprechender.

Java:
public boolean istKleiner_Unsinn(int other){
  return other<10 && other<5;
}
 

ARadauer

Top Contributor
Also dann fänd ich das hier eleganter. Aber so manch einer findet natürlich die if-else-Blöcke sprechender.

Java:
public boolean istKleiner_Unsinn(int other){
  return other<10 && other<5;
}

Ein _ in einer Methode ist alles andere als elegant in JAVA

Java:
}     <---------------------------hier erwartet der compiler ein return statement
            else{
nein... erwartete er nicht...
 

turing

Mitglied
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.
 

Haave

Top Contributor
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" :D 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.
 

tentigo

Mitglied
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?

MfG
N.
 
Zuletzt bearbeitet:

Haave

Top Contributor
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:
 
Zuletzt bearbeitet:

tentigo

Mitglied
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
 
Zuletzt bearbeitet:

tentigo

Mitglied
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];
	}	
	}
}
MfG
N.
 
Zuletzt bearbeitet:
S

SlaterB

Gast
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
 
Zuletzt bearbeitet von einem Moderator:

jgh

Top Contributor
gibst du deinem Programm denn auch einen Wert mit?

[c] double verbrauch = Double.parseDouble(args[0]);[/c] denn ansonsten fliegt er hier ja schon raus?


edit: to late :(
 

tentigo

Mitglied
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?
 
Zuletzt bearbeitet:

tentigo

Mitglied
ok.. nachdem ich nun schon auf dem richtigen weg bin... vielen dank zuerst einmal..

ich muss natürlich das programm so ausführen
java DemoTarifRechner <zahl>, wobei zahl ein double ist

jedoch kommt nun als Antwort

"Syntaxfehler"

sry wegen der Unannehmlichkeiten... aber naja.. so sind die Javaanfänger...

MfG
N.
 
S

SlaterB

Gast
"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
 

tentigo

Mitglied
Danke für die rasche antwort
Code:
C:\Users\Studium\Desktop\Uni\Info\HA 11>java DemoTarifRechner <400.0>
Syntaxfehler.

ich weiß.. nicht akzeptabel aber vorhanden...

Ist ein Fehler bei der Ausführung

rot unterstrichen? nutze kein Eclipse falls du darauf hinauswillst.. ich soll ja lernen usw ;)

MfG
N.
 
S

SlaterB

Gast
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
 

tentigo

Mitglied
in der Tat.. ohne Klammern

vielen Dank, ich muss jetzt nur nochmal die Tarifevergleichsfunktion bearbeiten, denn es kommt immer Vattenfall als anbieter heraus und das .. geht ja nich ;)

vielen vielen Dank

MfG
N.
 
B

bone2

Gast
erst:
Java:
    public abstract void berechneTarif(double kwh);
dann
Java:
        tarife[2].berechneTarif(tarife[2].getKwh());
wundert mich das es überhaupt startet
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
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
 

tentigo

Mitglied
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;
	}
 
Zuletzt bearbeitet:
S

SlaterB

Gast
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


(5 * kwh + kwh) ist übrigens == (6 * kwh)
 

tentigo

Mitglied
habs nochmal geändert, bzw das + hätte ein * sein müssen...

naja aber wenn ich 1kwh berechne müsste vattenfall mir nur 499 berechnen...tuts aber nicht sondern es rechnet 499+1*20=519

also schließe ich darauf, dass irgendwo was spinnt..
denn .. naja es passt nicht...
tarif Nuon
Java:
public void berechneTarif(double kwh){	
		setTarif(getGrundpreis()+(5*kwh*kwh)/1000);	
	}
tarif Vattenfall
Java:
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));
		}
	}
tarif Eprimo
Java:
public void berechneTarif(double kwh) {
		setKwh(kwh);
		setTarif(getGrundpreis() + 20.0*kwh);
	}

mein TarifRechner.. (mit else, da ich mal 3 if bedingungen hatte aber dann ja ein return fehlte...)
Java:
public Tarif getBestTarif(double verbrauch){
	
		tarife[0].berechneTarif(verbrauch);
		tarife[1].berechneTarif(verbrauch);
		tarife[2].berechneTarif(verbrauch);
		
	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];
	}	
	}

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.
 
Zuletzt bearbeitet:
S

SlaterB

Gast
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..
 

tentigo

Mitglied
mysteriös... ne habe kein static verwendet..naja ich werds erstmal so stehen lassen...
vielen dank für die hilfe

ich werde mich bessern, was das posten angeht ;) versprochen

MfG
N.
 


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Missing Return Statement Java Basics - Anfänger-Themen 11
T Boolean Missing return Statement?! Java Basics - Anfänger-Themen 2
P Compiler-Fehler Boolean: Missing Return Statement Java Basics - Anfänger-Themen 4
I Methoden Missing return statement; Intervallschachtellung Java Basics - Anfänger-Themen 12
M missing return statement?! Java Basics - Anfänger-Themen 4
A Missing return-Statement Java Basics - Anfänger-Themen 9
E missing return statement Java Basics - Anfänger-Themen 6
C missing return statement Java Basics - Anfänger-Themen 5
dognose missing Return Statement Java Basics - Anfänger-Themen 4
G Missing return Statement Java Basics - Anfänger-Themen 2
R "missing return statement"? Java Basics - Anfänger-Themen 2
G missing return statement Java Basics - Anfänger-Themen 5
M missing return statement Java Basics - Anfänger-Themen 4
S Missing return Java Basics - Anfänger-Themen 4
Luk10 Return missing Java Basics - Anfänger-Themen 6
Syncopated Pandemonium Compiler-Fehler The constructor MP3File(File) refers to the missing type NoMPEGFramesException Java Basics - Anfänger-Themen 7
U Jar ist "missing" Java Basics - Anfänger-Themen 2
MiMa Java Doc mehrere Return Parameter Java Basics - Anfänger-Themen 11
G Return in While Schleife Java Basics - Anfänger-Themen 6
J Rekursive Funktion und return statement Java Basics - Anfänger-Themen 3
SUPERTJB return Problem Java Basics - Anfänger-Themen 3
M Warum return die Methode den Wert nicht Java Basics - Anfänger-Themen 5
S Methoden Return Rückgabewert wird nicht übergeben Java Basics - Anfänger-Themen 8
schredder Strings und reguläre Ausdrücke - Methode mit return string.matches Java Basics - Anfänger-Themen 5
I Return Array Java Basics - Anfänger-Themen 4
Q return Ausgabe Java Basics - Anfänger-Themen 4
javapingu Variablenwerte ändern ohne return Statement? Java Basics - Anfänger-Themen 7
C Ausgabe boolean return ((n==9)||(n==0)); Java Basics - Anfänger-Themen 13
G return 1 + methode Java Basics - Anfänger-Themen 4
H Methode mit Array als Rückgabe This method must return a result of Type int[] Java Basics - Anfänger-Themen 2
JD_1998 Hilfsmethode if return funktioniert nicht Java Basics - Anfänger-Themen 2
T Return einer anderen Methode herausfinden Java Basics - Anfänger-Themen 9
C ArrayList mit return zurückgeben Java Basics - Anfänger-Themen 13
M kann man return in nur einer Methode einsetzen? Java Basics - Anfänger-Themen 7
V return String[] führt zu [Ljava.lang.String;@50675690 Java Basics - Anfänger-Themen 7
K Return in Schleife Java Basics - Anfänger-Themen 4
B Statische Methode return funktioniert nicht. Java Basics - Anfänger-Themen 19
das_leon return message Java Basics - Anfänger-Themen 2
C return kann nicht auf variable zugreifen Java Basics - Anfänger-Themen 26
N Ausführung gibt keinen Fehler an, Return wird aber nicht ausgegeben Java Basics - Anfänger-Themen 22
R return: cannot find symbol Java Basics - Anfänger-Themen 2
R Ratespiel mit Return und einer Eingabe Java Basics - Anfänger-Themen 1
Z Return in While-Schleife Java Basics - Anfänger-Themen 7
N Frage zu this, super und return Java Basics - Anfänger-Themen 13
K ArrayList ausgeben mit return Java Basics - Anfänger-Themen 6
M Return statement Java Basics - Anfänger-Themen 4
J-Gallus Ein Getter bekommt eine anderen Type als er Return soll Java Basics - Anfänger-Themen 9
J Variablen Komsiche System.in.read() return-value? Java Basics - Anfänger-Themen 3
M Abbrechen Methode ohne return Java Basics - Anfänger-Themen 3
M Methoden Datei einlesen und als return übergeben. Java Basics - Anfänger-Themen 8
L OOP Return Java Basics - Anfänger-Themen 10
L Erste Schritte Frage zu 'return' Java Basics - Anfänger-Themen 4
J Methoden Rekursive Return Methode Java Basics - Anfänger-Themen 2
W Return statement in Methode nur bei if-clause Java Basics - Anfänger-Themen 3
D Methoden Return-Wert wird nicht ausgegeben Java Basics - Anfänger-Themen 3
F Return-Anweisung Java Basics - Anfänger-Themen 2
E Erste Schritte <? super Unterklasse> Return-Typ darf nicht vom Wildcard-Typ sein Java Basics - Anfänger-Themen 5
B OOP Methode mit Array mit return verlassen Java Basics - Anfänger-Themen 8
J Grundsätzliche Frage zu return Types in Methoden Java Basics - Anfänger-Themen 6
G return-wert für eine Methode Java Basics - Anfänger-Themen 1
B Methoden Probleme mit for Schleife und return Java Basics - Anfänger-Themen 5
Q Tastatureingabe direkt nach Eingabe (ohne zwischenzeitliches "Return" o.Ä ) weiterverwenden Java Basics - Anfänger-Themen 1
B Variablen Problem mit return String[] Java Basics - Anfänger-Themen 4
O Per return Run Methode beenden Java Basics - Anfänger-Themen 3
M Arrays als return Value? Java Basics - Anfänger-Themen 2
C Return statement Java Basics - Anfänger-Themen 10
Z Methoden return nullprüfung Java Basics - Anfänger-Themen 7
O Java return in Schleife Java Basics - Anfänger-Themen 4
K Was macht hier genau return? Java Basics - Anfänger-Themen 2
G Methoden Was bedeutet return in einer Methode Java Basics - Anfänger-Themen 5
Y Warum void statt Datentyp + return Java Basics - Anfänger-Themen 4
K Variablen RETURN in Case-Switch / This method must return a result of type Item Java Basics - Anfänger-Themen 4
K Erste Schritte "return" Problem bei Rekursion Java Basics - Anfänger-Themen 8
R If Verschachtelung und return; Java Basics - Anfänger-Themen 4
M Frage zum return; Befehl Java Basics - Anfänger-Themen 1
S try-catch - Variablen werden nicht an return übergeben Java Basics - Anfänger-Themen 3
C Einige Anfängerfragen (Return-Wert, Exception...) Java Basics - Anfänger-Themen 11
S Methoden Return Java Basics - Anfänger-Themen 8
T return-Wert verwenden? Java Basics - Anfänger-Themen 12
T Return eines Int-Werts? Java Basics - Anfänger-Themen 3
W return-Anweisung gibt nichts aus Java Basics - Anfänger-Themen 5
R Return in If Java Basics - Anfänger-Themen 10
S Methoden Return Anweisung beendet Methode nicht, stattdessen wird diese zweimal durchlaufen Java Basics - Anfänger-Themen 3
G array return methode Java Basics - Anfänger-Themen 10
L return wird nicht erkannt? Java Basics - Anfänger-Themen 3
J Regex mit Return Java Basics - Anfänger-Themen 3
M Variablen return-array klonen Java Basics - Anfänger-Themen 3
A Methode mit Array als Param --> return Array --> Fehler Java Basics - Anfänger-Themen 3
S Zeichen einlesen ohne Return? Java Basics - Anfänger-Themen 19
S probleme mit der return anweisung Java Basics - Anfänger-Themen 20
E Warum wird Methode nicht durch return-Befehl beendet? Java Basics - Anfänger-Themen 3
V Erste Schritte Return ohne Argument Java Basics - Anfänger-Themen 6
S Frage zu Vererbung und return. Java Basics - Anfänger-Themen 4
R return (mehrere floats) Java Basics - Anfänger-Themen 11
E Return String Java Basics - Anfänger-Themen 10
P Methoden Methode ohne return abbrechen? Java Basics - Anfänger-Themen 12
I Return Befehl in Methode Java Basics - Anfänger-Themen 13
M Problem mit boolean. Return nicht erkannt Java Basics - Anfänger-Themen 10
P Return aus For-Schleife Java Basics - Anfänger-Themen 19
S return in GUI ? Java Basics - Anfänger-Themen 12

Ähnliche Java Themen

Neue Themen


Oben