Compiler-Fehler Methode wird nicht bzw. als Fehler erkannt

fuerteb

Neues Mitglied
Hi,
ich habe relativ neu mit Java angefangen und finde nicht heraus, warum die Methode "runden" nicht erkannt wird.
Hier der Code:

public class Main {

public static void main(String[] args) {

String[] produkt = new String[4];
int[] menge = new int[4];
double[] preis = new double[4];

produkt[0] = "Apfel";
preis[0] = 1.10;
menge[0] = 3;

double gesamtpreis;

public double runden(double value) {
double d = Math.pow(10, 2);
return Math.round(value * d) / d;
}

for(int i = 0; i < 4; i++) {
System.out.println(produkt + " " + menge + "x " + preis);
gesamtpreis = preis * menge;
gesamtpreis = runden(gesamtpreis);
System.out.println(" " + gesamtpreis);
}
 
Java:
public class Main {

    public static void main(String[] args) {
        String[] produkt = new String[4];
        int[] menge = new int[4];
        double[] preis = new double[4];

        produkt[0] = "Apfel";
        preis[0] = 1.10;
        menge[0] = 3;
        double gesamtpreis;
        for(int i = 0; i < 4; i++) {
            System.out.println(produkt + " " + menge + "x " + preis);
            gesamtpreis = preis * menge;
            gesamtpreis = runden(gesamtpreis);
            System.out.println(" " + gesamtpreis);
        }       
    }

    public static double runden(double value) {
        double d = Math.pow(10, 2);
        return Math.round(value * d) / d;
    }
}
 
Als du den Beitrag geschrieben hast, gab es im Texteditor ein kleines Icon </> links in der Iconzeile. Das ist dafür da, Code einzufügen.
Alternativ kannst du auch [code=java]....[/code] schreiben. Du kannst deinen Beitrag noch diesbezüglich bearbeiten.

warum die Methode "runden" nicht erkannt wird.
Auch wenn das in vielen Sprachen geht, aber in Java kann man Methoden nicht direkt innerhalb anderer Methoden deklarieren.
Du deklarierst eine Methode "runden" direkt innerhalb der main() Methode. Das geht so nicht. Deklariere runden() als statische Methode _neben_ der main() Methode.
 
Java bietet hier eine Möglichkeit, und zwar z.B. über Supplier, Consumer, Funktionen usw (intern machen die (meisten?) anderen Sprachen das eh auch nicht anders).
Hier bietet sich z.B. eine Funktion an
Java:
public void main(String...) {
    //Lambda Ausdruck, der wird vom Compiler ersetzt durch new Function<>() {public Double apply(Double value) {...}}
    Function<Double,Double> runden = value -> {
        double d = Math.pow(10, 2);
        return Math.round(value * d) / d;     
    }
    gesamtpreis = runden.apply(gesamtpreis);
}
Für gewöhnlich ist es aber besser (lesbarer), die Methoden extern zu deklarieren wie oben gezeigt
 
Zuletzt bearbeitet:
Java bietet hier eine Möglichkeit, und zwar z.B. über Supplier, Consumer, Funktionen usw (intern machen die (meisten?) anderen Sprachen das eh auch nicht anders).
Das ist etwas anderes, als eine Funktion/Methode innerhalb des lexikalischen Scopes der äusseren Funktion/Methode zu deklarieren. In JavaScript ist das anders. In Go ist das anders. Keine andere Sprache, die mir einfällt, macht das so wie Java bzw. die JVM.
In Java bzw. in der JVM ist das eine Implementierung eines Interfaces und ist nur syntaktischer Zucker für quasi eine innere anonyme Klasse (auch, wenn die Runtime dann davon eine Klasse zur Laufzeit statt zur Compilezeit generiert).
Und nein, die Lambda wird nicht vom Compiler durch den von dir im Inline-Kommentar genannten Code ersetzt. Die Ersetzung sieht tatsächlich ganz anders aus (Generierung einer Methode und einer Dynamic Invoke Bootstrap Methode, etc.)
 

Zurück
Oben