Variablen Variable aus if in main nutzen

AdmAsgard

Mitglied
Hellas !

Bin Java Anfänger und hab ein Problem mit einem Berechnungsprogramm.

Das Programm berechnet (nach diversen Abfragen) einen Wert in verschiedenen Methoden, welcher am Ende als Variable in einer weiteren Berechnung verwendet werden soll.

Jetzt hab ich das Problem, dass der erste Werd (Flächenträgheitsmoment) zwar berechnet wird, ich diesen in der Schleife auch initialisiert habe, aber wenn ich im nächsten Schritt in die Variable für eine weitere Berechnung, welche ebenfalls in einer Methode stattfindet, ich die Meldung bekomme, dass die Variable nicht initialisiert ist. Hab es auch schon ohne Methode probiert, selbes Problem:

"Uncompilable source code - variable f might not have been initialized"

Wie bekomme ich die Variable in der Main wieder initialisiert mit dem Wert der vorher berechnet wurde ?

Suche schon seit drei Stunden im Internet nach Lösungen, hab auch einiges ausprobiert (globale Variablen, return,..), aber weiß leider nicht weiter. :bahnhof:

Hat jemand eine Idee ?

Hier der Code
Java:
import java.util.Scanner;

public class Aufgabe5_1028797_1 {

public static float qquerschnitt (float a, float l) {  
        float fmoment = (a*a*a*a)/12;
        return fmoment; 
            }
public static float kquerschnitt (float a, float l) {  
        float fmoment = ((a*a*a*a)*3,14)/4;
        return fmoment; 
            }
public static float iquerschnitt (float a, float l) {  
        float fmoment = (10*(a*a*a*a))/144;
        return fmoment; 
            }
public static float beidseitig (float f, float n, float l) {  
        float biegung = (n*(l*l*l))/(48*210000*f);
        return biegung; 
            }
public static float krag (float f, float n, float l) {  
        float biegung = (n*(l*l*l))/(3*210000*f);
        return biegung; 
        }      
            
    public static void main ( String[] args ) {   
        Scanner sc = new Scanner(System.in);

        System.out.println("Querschnittsform auswählen ")
        System.out.println("q....Quadratische Form"); 
        System.out.println("k....Kreisform");
        System.out.println("i....I-Träger");
        System.out.println();
        System.out.print("Auswahl: ");
        char m = sc.next().charAt(0);
        System.out.println("----------------------");
        System.out.print("Geben Sie die Abmessung in mm an: ");
        float a = sc.nextInt();
        System.out.print("Geben Sie die Länge in mm an: ");
        float l = sc.nextInt();
        System.out.print("Geben Sie die Kraft in N an: ");
        float n = sc.nextInt();
        
        float f;
        switch( m ) {   //Mehrfachanweisung
                case 'q':
                    System.out.println("Fmoment:" +qquerschnitt(a,l));
                    f = qquerschnitt(a,l);
                    break;
                case 'k':
                    System.out.println("Fmoment:" +kquerschnitt(a,l));
                    f = kquerschnitt(a,l);
                    break;
                case 'i':
                    System.out.println("Fmoment:" +iquerschnitt(a,l)));
                    f = iquerschnitt(a,l);
                    break;
            }
        System.out.println("----------------------");
        System.out.println("Auflagerform auswählen ")
        System.out.println("b....Beidseitig gelagert"); 
        System.out.println("k....Kragträger");
        System.out.println();
        System.out.print("Auswahl: ");
        char o = sc.next().charAt(0);

        switch( o ) {   //Mehrfachanweisung
                case 'b':
                    System.out.println("Maximale Durchbiegung:" +beidseitig(f,n,l));
                    break;
                case 'k':
                    System.out.println("Maximale Durchbiegung:" +krag(f,n,l));
                    break;
                    }
}
 
Zuletzt bearbeitet von einem Moderator:
Wie bekomme ich die Variable in der Main wieder initialisiert mit dem Wert der vorher berechnet wurde ?
Gar nicht, eine Initialisierung wird nur ein einziges Mal pro Variable gemacht, und gibt - wie der Name schon andeutet - einen Anfangswert an. Dass du diese Fehlermeldung erhälst, liegt einfach daran, dass du auf eine Variable zugreifen möchtest, du u.U. noch überhaupt gar keinen Wert besitzt (nicht mal null). In der Deklaration schreibst du also z.B. einfach:
Java:
int meineVariable = 0;
Im Übrigen schreibt man Java-Code in JAVA-Tags (das sind die mit der Kaffetasse drei Zeichen links von dem, welches du genommen hast^^).

EDIT: Nochmal deutlicher: Was passiert in deiner Anwendung, wenn keine der zuälssigen Tasten gedrückt wurde? Antwort:
Code:
f
bleibt unbelegt, wird aber zum Schluss (bei der Durchbiegung) von dir in einem Methodenaufruf benötigt.
 
Zuletzt bearbeitet:
ups sry 🙂

Einen Wert hat die Variable, wenn ich den Wert in der Case-Anweisung ausgeben wird er richtig ausgegeben.

Kann ich den Variablenwert irgendwie einer zweiten "Hilfsvariable" in der Main zuweisen? Hab das nämlich probiert, aber es hat nicht funktioniert.

Was passiert wenn eine ungültige Menüauswahl getroffen wurde hab ich mir noch nicht überlegt. Wollte bisher nur einmal dass die Berechnungen funktionieren.

update: bzw. kann ich keine variable deklarieren, welche im main und in der case-anweisung funktioniert?
hab das mit einer globalen zwar versucht, aber da kommt die fehlermeldung, dass ich diese nicht in einer "statischen anweisung" verwenden kann.
 
Zuletzt bearbeitet:
Eine gute Seite mit jede Menge Infos zur If-Schleife: If-Schleifen

Ansonsten wurde alles gesagt. Initialisiere die Variablen sauber und wenn du etwas außerhalb eines Codeblocks brauchst musst du es als Rückgabewert oder Attribut der Klasse definieren.

[OT]Sorry konnte ich mir nicht verkneifen...[/OT]
 
Einen Wert hat die Variable, wenn ich den Wert in der Case-Anweisung ausgeben wird er richtig ausgegeben.
Wie hast´n das jetzt festgestellt, ich denke, dein Programm kompiliert gar nicht erst? Wie auch immer. Du gehst ja immer davon aus, dass wirklich nur zulässige Werte eingegeben und somit f IMMER belegt wird. Da der Kompiler aber diese Annahme nicht trifft/kennt, wirft er dir eben diesen Fehler um die Ohren. Du kannst auch vor dem "zweiten" Codeblovk erstmal prüfen, ob f mit einem Wert belegt wurde. Sollte dem so sein, kannst du fortfahren mit der nächsten Eingabe, ansonsten muss der erste Schritt widerholt werden. Dafür brauchst du keine Hilfsvariablen und keine Zauberei, nur ein wenig Köpfchen...

EDIT: Warum heißt dein Thema eigtl.
Variable aus if-Schleife in main nutzen
Ich seh da nirgends auch nur ein einziges if...
 
Ach sry, hab es zwischendurch mit einer if-schleife statt case gemacht. Wollte probieren ob es mit einer if-schleife funktioniert. Kommt aber die gleiche Fehlermeldung.

Doch es kompiliert schon, nur bei der letzten Berechnung wenn ich die Auswahl treffe kommt die Fehlermeldung.

Querschnittsform auswählen
q....Quadratische Form
k....Kreisform
i....I-Träger

Auswahl: q
----------------------
Geben Sie die Abmessung in mm an: 20
Geben Sie die Länge in mm an: 20
Geben Sie die Kraft in N an: 20
Fmoment:13333.333
----------------------
Auflagerform auswählen
b....Beidseitig gelagert
k....Kragträger

Auswahl: b
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - variable f might not have been initialized
at Aufgabe5_1028797_1.main(Aufgabe5_1028797_1.java:72)
Java Result: 1

Der "Fmoment-Wert" ist der den ich benötige, da er ausgegeben wird, ist er in der Case-Anweisung auch initialisiert.
 
Zuletzt bearbeitet:
Ja ok es kompiliert nicht vollständig. Wie gesagt bin Anfänger.

Ich möchte ja den Fehler wegbekommen, aber weiß nicht wie. Die Variable ist deklariert und initialisiert, aber ich kann sie in der main-methode nicht verwenden.

Und ja den link hab ich mir angesehen, was bringt mir das jetzt, außer das ich versehentlich if-schleife statt abfrage geschrieben hab ?
 
In deinem Switch Statement kann es passieren das 'f' nicht zugewiesen wird... Da meckert der Compiler.

Lösung 1:

'f' initial mit einem default belegen

Lösung 2:

Einen default case mit in das Switch Statement aufnehmen.

Lösung 3:

Exception werfen, Programm beenden, etc... wenn der default nicht verwendbar ist
 
Zuletzt bearbeitet von einem Moderator:
Ich möchte ja den Fehler wegbekommen, aber weiß nicht wie. Die Variable ist deklariert und initialisiert, aber ich kann sie in der main-methode nicht verwenden.
Ich habe langsam das Gefühl, ich rede gegen eine Wand. Was genau hast du seit meiner ersten Antwort an deinem Code verändert?
 
Hatte garnichts verändert, hab nur aus versehen im betreff if-schleife geschrieben.

Hab jetzt float f=0; als initialwert gesetzt und es funktioniert.

danke für die hilfe !
 
Und ja den link hab ich mir angesehen, was bringt mir das jetzt, außer das ich versehentlich if-schleife statt abfrage geschrieben hab ?

Du hast danach immer noch if Schleife geschrieben 3 mal sogar. Gewöhn es dir ab, denn es gibt schlicht keine If-Schleife. Du sagst ja auch nicht "Container" und meinst eine Variable oder? Das ist nicht böse gemeint von mir, aber du solltest schon darauf achten die Sachen korrekt zu bennen vor allem wenn dir das auch aufgezeigt wird 🙂

Zum lernen gehört halt auch die korrekte Bezeichnung dazu.

@HimBromBeere Hast natürlich recht, dass es eine If-Anweisung ist. Die Seite ist auch nicht von mir. Aber du verstehst was ich ausdrücken wollte von daher ^^
 
Ich finde dieses Thema eine tolle Sache. Ich erinnere mich noch genau an die tollen jungen Jahre meines Dasein als ich mit dem alten Commodore C64 meine ersten sinnlichen Programmiererfahrungen erlebt habe. Ich wünsche dir viel Glück junger Programmierer!

Frank
 

Zurück
Oben