error: '.class' expected switch(char)

maxmuster987

Aktives Mitglied
Ich habe folgenden Code erst mal verfasst, der noch nicht fertig ist, aber ich bin auf dem Weg dahin.

Dabei erhalte ich eine Fehlermeldung beim Kompilieren, wie sie oben steht.

Ich will, dass das Menü auch bei Eingabe eines Kleinbuchstabens funktioniert, also egal ob klein oder groß, es soll immer als groß gewertet werden. Ich erhalte die Fehlermeldung für Zeile 39: error: '.class' expected switch(char) {

Was verstehe ich darunter? Was mache ich aktuell falsch?

Java:
import java.io.*;
import javax.swing.*;
import java.util.*;

public class Uebung {
    public static void main (String[] args) {
        int i=0;
        String eing;
        int KoZeiPa = args.length;
        int durchmesseranzahl = KoZeiPa-1;
        double durchmFeld [] = new double [durchmesseranzahl];
        double widerstandsmoment [] = new double [durchmesseranzahl];
        double aFeld [] = new double [durchmesseranzahl];
        double laenge = Double.parseDouble(args[0]);
               
        System.out.println("=========================================");
        System.out.println("===Variantenuntersuchung einer Stuetze===");
        System.out.println("=========================================");
       

       
        if(KoZeiPa==0) {
            System.out.println("Kommandozeilenparameter fehlen");
            System.out.println("-> -Programmabbruch-");
            System.exit(0);
        }
   
        for(i=0; i<durchmesseranzahl; i++){
            durchmFeld[i]=Double.parseDouble(args[i+1]); //+1, weil args[0] ist die Länge, aber wir brauchen Prüfung AB Durchmessereingaben
            durchmesserpruefung(durchmFeld[i]);
        }
       
        Arrays.sort(durchmFeld);
       

            eing = JOptionPane.showInputDialog("(A) Berechnung und Ausgabe\n(V) Volumen anzeigen\n***********************************************\n(X) Programm beenden");
            char wahl = eing.toUpperCase().charAt(0);
           
            switch(char) {
                case 'A':
               
               
            }
       

       
        System.exit(0);  
    }
   
   
   
    public static void durchmesserpruefung(double durchmFeld) {
        if(durchmFeld<100 | durchmFeld>250) {
            System.out.println("Achtung: Durchmesser " +durchmFeld +" [mm] unegueltig -> Programmabbruch");
            System.exit(0);
        }
    }
   
    public static double widerstandsmoment(double durchmFeld){
        double wy = Math.PI*(Math.pow(durchmFeld/2,3)/8);
        return wy;
    }
   
   
   
}
 

httpdigest

Top Contributor
Java:
eing = JOptionPane.showInputDialog("...");
char wahl = eing.toUpperCase().charAt(0);
switch (char) {
  case 'A':
}
Bezüglich des Fehlers: "char" ist ein Datentyp. Du machst gerade einen Switch nicht auf einen Wert (der bei dir in der Variablen wahl gespeichert ist), sondern auf einen Datentyp. Das geht natürlich nicht. Du solltest in dem switch schon die Variable wahl nennen/nutzen.
 

maxmuster987

Aktives Mitglied
Ich weiß nicht, ob ich einen neuen Thread dafür eröffnen soll oder einfach hier weiterfrage, aber folgendes:
Ich möchte die switch(wahl) Abfrage so oft neu starten, bis ich X eingebe, weil bei X soll das Programm komplett beendet werden.
Bisher habe ich das nur mit Zahlenwerten gemacht. Wenn ich den Code wie folgt schreibe, dann komme ich in eine Endlosschleife mit Zeile 67 while(wahl!='X');

Das Programm soll aus der Kommandozeile Werte einlesen und verarbeiten. Der erste eingegeben Wert ist die Länge und die x-beliebigen Werte darauffolgend sind Durchmesserwerte.
Wenn jetzt der case 'A' abgearbeitet ist, dann wird ja anscheinend durch meine Bedingung while(wahl!='X'); dieser Vorgang unendlich mal wiederholt, das möchte ich ja nicht. Bei case 'A' soll er das Ganze einmal abarbeiten und mich danach wieder nach der Dialogbox abfragen, damit ich den nächsten case eingeben kann.


Java:
import java.io.*;
import javax.swing.*;
import java.util.*;

public class Uebung {
    public static void main (String[] args) {
        int i=0;
        String eing;
        int KoZeiPa = args.length;
        int durchmesseranzahl = KoZeiPa-1;
        double durchmFeld [] = new double [durchmesseranzahl];
        double wyFeld [] = new double [durchmesseranzahl];
        double aFeld [] = new double [durchmesseranzahl];
        double laenge = Double.parseDouble(args[0]);
                
        System.out.println("=========================================");
        System.out.println("===Variantenuntersuchung einer Stuetze===");
        System.out.println("=========================================");
        

        
        if(KoZeiPa==0) {
            System.out.println("Kommandozeilenparameter fehlen");
            System.out.println("-> -Programmabbruch-");
            System.exit(0);
        }
    
        for(i=0; i<durchmesseranzahl; i++){
            durchmFeld[i]=Double.parseDouble(args[i+1]); //+1, weil args[0] ist die Länge, aber wir brauchen Prüfung AB Durchmessereingaben
            durchmesserpruefung(durchmFeld[i]);
        }
        
        Arrays.sort(durchmFeld);
        

            eing = JOptionPane.showInputDialog("(A) Berechnung und Ausgabe\n(V) Volumen anzeigen\n***********************************************\n(X) Programm beenden");
            char wahl = eing.toUpperCase().charAt(0);
            do {
                switch(wahl) {
                    case 'A':
                    System.out.println("Variante \t Durchm. [mm] \t Flaeche [mm2] \t Widerstandsmoment [mm3]");
                    System.out.println("======================================================================================");
                    for(i=0; i<durchmesseranzahl; i++) {
                        wyFeld[i] = wy(durchmFeld[i]);
                        aFeld[i] = flaeche(durchmFeld[i]);
                        
                        System.out.print("("+(i+1)+")");
                        System.out.print("\t\t "+durchmFeld[i]);
                        System.out.print("\t\t "+aFeld[i]);
                        System.out.print("\t\t "+wyFeld[i] +"\n");
                    }
                    break;
                    
                    case 'V':
                    
                    break;
                    
                    default:
                    System.out.println("Falsche Eingabe - bitte erneut.")
                    break;
                    
                    case 'X':
                    System.out.println("Programm beendet.");
                    System.exit(0);
                }
            }
            while(wahl!='X');
            
        System.exit(0);   
    }
        
    
    public static void durchmesserpruefung(double durchmFeld) {
        if(durchmFeld<100 | durchmFeld>250) {
            System.out.println("Achtung: Durchmesser " +durchmFeld +" [mm] unegueltig -> Programmabbruch");
            System.exit(0);
        }
    }
    
    public static double wy(double durchmFeld){
        double wy = Math.PI*(Math.pow(durchmFeld/2.,3)/8);
        return wy;
    }
    
    public static double flaeche(double durchmFeld) {
        double a = (Math.PI/8.)*Math.pow(durchmFeld, 2);
        return a;
    }
    
    
    
}
 

Jw456

Top Contributor
Dann muss die do while vor der Eingabe abfrage starten .
In der Schleife musst du die Dialogbox aufrufen.

Da du ja ein case 'X' hast brauchst du die Abfrage in der while eigentlich nicht. Könnte auch true sein.
 

maxmuster987

Aktives Mitglied
Dann muss die do while vor der Eingabe abfrage starten .
In der Schleife musst du die Dialogbox aufrufen.

Da du ja ein case 'X' hast brauchst du die Abfrage in der while eigentlich nicht. Könnte auch true sein.
Das mit dem boolean true und false habe ich bis heute noch nicht verstanden, deswegen meide ich die eigentlich ganz gerne. :-D

Das Ganze hast du aber nicht so gemeint, vermute ich mal, denn so funktioniert das nicht.

Java:
            do {
                eing = JOptionPane.showInputDialog("(A) Berechnung und Ausgabe\n(V) Volumen anzeigen\n***********************************************\n(X) Programm beenden");
                char wahl = eing.toUpperCase().charAt(0);
            }
            while(wahl!='X');
            
                switch(wahl) {
                    case 'A':
                        System.out.println("Variante \t Durchm. [mm] \t Flaeche [mm2] \t Widerstandsmoment [mm3]");
                        System.out.println("======================================================================================");
                        for(i=0; i<durchmesseranzahl; i++) {
                            wyFeld[i] = wy(durchmFeld[i]);
                            aFeld[i] = flaeche(durchmFeld[i]);
                            
                            System.out.print("("+(i+1)+")");
                            System.out.print("\t\t "+durchmFeld[i]);
                            System.out.print("\t\t "+aFeld[i]);
                            System.out.print("\t\t "+wyFeld[i] +"\n");
                        }
                    break;
                    
                    case 'V':
                        if(wyFeld[i]==0) {
                            System.out.println("Kein Wert gefunden. Erst mit Menuepunkt A starten.");
                            System.exit(0);
                        }                   
                    break;
                    
                    default:
                        System.out.println("Falsche Eingabe - bitte erneut.");
                    break;
                    
                    case 'X':
                        System.out.println("Programm beendet.");
                        System.exit(0);
                }       
        System.exit(0);
 

maxmuster987

Aktives Mitglied
Ich hab den Code einmal fast komplett aufgeschrieben. Um case 'V': kümmere ich mich gleich.
Wenn ich das jetzt durchlaufen lasse, dann erhalte ich für Zeile 39 und 41:
error: cannot find symbol while(wahl!='X');
error: cannot find symbol switch(wahl) {
symbol: variable wahl

Solange die Bedienung in der while true ergibt wird die Scheife ausgeführt.

Was passiert jetzt in deiner Schleife?

Jetzt müsste sie doch immer ausgeführt werden, wenn ich irgendwas eingebe außer 'X'. Weil ich sage: führe die Eingabe so lange aus, solange die Eingabe NICHT X ist.


Java:
import java.io.*;
import javax.swing.*;
import java.util.*;

public class Uebung {
    public static void main (String[] args) {
        int i=0;
        String eing;
        int KoZeiPa = args.length;
        double laenge = Double.parseDouble(args[0]);
               
        System.out.println("=========================================");
        System.out.println("===Variantenuntersuchung einer Stuetze===");
        System.out.println("=========================================");
       

       
        if(KoZeiPa==0) {
            System.out.println("Kommandozeilenparameter fehlen");
            System.out.println("-> -Programmabbruch-");
            System.exit(0);
        }
        int durchmesseranzahl = KoZeiPa-1;
        double durchmFeld [] = new double [durchmesseranzahl];
        double wyFeld [] = new double [durchmesseranzahl];
        double aFeld [] = new double [durchmesseranzahl];
   
        for(i=0; i<durchmesseranzahl; i++){
            durchmFeld[i]=Double.parseDouble(args[i+1]); //+1, weil args[0] ist die Länge, aber wir brauchen Prüfung AB Durchmessereingaben
            durchmesserpruefung(durchmFeld[i]);
        }
       
        Arrays.sort(durchmFeld);
       
        do {
            eing = JOptionPane.showInputDialog("(A) Berechnung und Ausgabe\n(V) Volumen anzeigen\n***********************************************\n(X) Programm beenden");
            char wahl = eing.toUpperCase().charAt(0);
        }
        while(wahl!='X');              

        switch(wahl) {
            case 'A':
                System.out.println("Variante \t Durchm. [mm] \t Flaeche [mm2] \t\t Widerstandsmoment [mm3]");
                System.out.println("======================================================================================");
                    for(i=0; i<durchmesseranzahl; i++) {
                        wyFeld[i] = wy(durchmFeld[i]);
                        aFeld[i] = flaeche(durchmFeld[i]);
                       
                        System.out.print("("+(i+1)+")");
                        System.out.print("\t\t "+durchmFeld[i]);
                        System.out.print("\t\t "+aFeld[i]);
                        System.out.print("\t "+wyFeld[i] +"\n");
                    }
                    break;
                   
            case 'V':
                   
            break;
                   
            default:
                System.out.println("Falsche Eingabe - bitte erneut.");
            break;
                   
            case 'X':
                System.out.println("Programm beendet.");
                System.exit(0);
            break;
        }
       
        System.exit(0);  
    }

    //METHODEN
    public static void durchmesserpruefung(double durchmFeld) {
        if(durchmFeld<100 | durchmFeld>250) {
            System.out.println("Achtung: Durchmesser " +durchmFeld +" [mm] unegueltig -> Programmabbruch");
            System.exit(0);
        }
    }
   
    public static double wy(double durchmFeld){
        double wy = Math.PI*(Math.pow(durchmFeld/2.,3)/8);
        return wy;
    }
   
    public static double flaeche(double durchmFeld) {
        double a = (Math.PI/8.)*Math.pow(durchmFeld, 2);
        return a;
    }
   
}


Nachtrag, da sich unsere Antworten überschnitten haben:

Wann kommst du zu deinem Switch und was steht da in deiner Variable?
Zu meinem switch komme ich doch direkt nach Eingabe einer Variable innerhalb der Dialogbox. In der Variable wahl steht dann der "Wert" bzw. der Buchstabe, den ich eingegeben habe.
 

maxmuster987

Aktives Mitglied
Jetzt erhalte ich nur noch einen Fehler in Zeile 34 mit cannot find symbol while(wahl!='X');
Der findet immer noch nicht die Variable wahl.

Java:
        do {
            eing = JOptionPane.showInputDialog("(A) Berechnung und Ausgabe\n(V) Volumen anzeigen\n***********************************************\n(X) Programm beenden");
            char wahl = eing.toUpperCase().charAt(0);

            switch(wahl) {
                case 'A':
                    System.out.println("Variante \t Durchm. [mm] \t Flaeche [mm2] \t\t Widerstandsmoment [mm3]");
                    System.out.println("======================================================================================");
                        for(i=0; i<durchmesseranzahl; i++) {
                            wyFeld[i] = wy(durchmFeld[i]);
                            aFeld[i] = flaeche(durchmFeld[i]);
                            
                            System.out.print("("+(i+1)+")");
                            System.out.print("\t\t "+durchmFeld[i]);
                            System.out.print("\t\t "+aFeld[i]);
                            System.out.print("\t "+wyFeld[i] +"\n");
                        }
                        break;
                        
                case 'V':
                        
                break;
                        
                default:
                    System.out.println("Falsche Eingabe - bitte erneut.");
                break;
                        
                case 'X':
                    System.out.println("Programm beendet.");
                    System.exit(0);
                break;
            }
        }
        while(wahl!='X');
 

Jw456

Top Contributor
Zu meinem switch komme ich doch direkt nach Eingabe einer Variable innerhalb der Dialogbox. In der Variable wahl steht dann der "Wert" bzw. der Buchstabe, den ich eingegeben habe.
[/QUOTE]

Nein solange du kein x eingibst bkeubst du in der eingabe Schleife. Das willst du nicht.
Wenn du ein x eingibst geht es weiter zum switsch.
und jetzt ist wahl ein x also ende Programm.
 

KonradN

Super-Moderator
Mitarbeiter
Du musst immer genau schauen, was in einer Schleife steht und was nicht. Dein Code macht so relativ wenig Sinn:

Du hast eine Schleife:
Code:
        do {
            eing = JOptionPane.showInputDialog("(A) Berechnung und Ausgabe\n(V) Volumen anzeigen\n***********************************************\n(X) Programm beenden");
            char wahl = eing.toUpperCase().charAt(0);
        }
        while(wahl!='X');
Damit fragst Du nach einer Eingabe bis X eingegeben wurde. Danach ist wahl == 'X' und ein Switch macht auch keinen Sinn mehr.

Evtl. hilft es Dir, wenn Du Deinen Code besser in Methoden zerteilst. Und Du diese auch immer erst in Worten formulierst (Wobei viele kleine Methoden mit vernünftigen Bezeichnern schon ausreichen können).

Und dann kann es eine Methode geben, die den Benutzer nach einer Auswahl fragt:
  • Menu anzeigen
  • Auswahl abfragen.
  • falls Auswahl gültig: Auswahl zurück geben
  • Starte von Anfang an.

Also Code wäre das dann etwas wie:
Java:
public static char menuAnzeigenUndAuswahlAbfragen {
    while (true) {
        menuAnzeigen();
        char value = eingabeAbfragen();
        if (valideAuswahl(value)) return value;
    }
}

Einfache kleine Methoden. Einfach zu überblicken. So unterteilt hast Du dann weniger Probleme mit den Blöcken vermute ich.
 

maxmuster987

Aktives Mitglied
Erstelle die variable wahl vor der do
Zuweisen dann in der Schleife
So einfach war die Problemfindung? Damit funktioniert doch der Code aktuell genauso wie ich es möchte. 😆

Evtl. hilft es Dir, wenn Du Deinen Code besser in Methoden zerteilst. Und Du diese auch immer erst in Worten formulierst (Wobei viele kleine Methoden mit vernünftigen Bezeichnern schon ausreichen können).
Das Problem ist, ich habe hier die Aufgabenstellung liegen und in der ist genau vorgegeben, WO ich Methoden verwenden soll und wo nicht. Deswegen nutze ich keine zusätzlichen Methoden, wenn sie nicht auch in der Aufgabenstellung verlangt sind. Und da ich bei den Methoden auch noch nicht sonderlich fit bin lasse ich es erst mal bleiben, wenn es auch so funktioniert😣
 

Jw456

Top Contributor
Wie ich am Anfang schon sagte kannst du hier auch while(true)
Schreiben da du ja eine Abbruch Bedingung in der switch hast.
 

maxmuster987

Aktives Mitglied
Sowas wie das hier meinst du dann, nehme ich mal an.
Das könnte vielleicht sogar hilfreich sein, wenn ich gleich case 'V' schreibe.
Vielleicht habt ihr ja vorher noch Tipps, bevor ich damit anfange und zwar soll 'V' folgendes tun:

Für einen Durchmesser, der als Kommandozeilenparameter hinterlegt ist, sollen die Daten Volumen, Durchmesser, Fläche ausgegeben werden.
Das heißt, es ploppt nach 'V' eine Dialogbox auf, die fragt, für welchen Durchmesser die Daten ausgegeben werden sollen.
Jetzt kommt die "Schwierigkeit" hinzu: Wenn ich einen Durchmesser eingebe, den ich vorher NICHT in der Kommandozeile hinterlegt habe, dann soll mir wieder die Dialogbox aufspringen und solange fragen, bis der Durchmesser mit einem Durchmesser in der Kommandozeile übereinstimmt.
Wenn er dann übereinstimmt, dann will ich wieder logischerweise in die alte Dialogbox vom Beginn springen.
Ich probiere mich gerade dran, aber wie gesagt- falls es da Hilfestellungen gibt oder worauf ich achten soll, dann bin ich dafür auch dankbar.


Java:
import java.io.*;
import javax.swing.*;
import java.util.*;

public class Uebung {
    public static void main (String[] args) {
        boolean ende = true;
        int i=0;
        String eing="";
        int KoZeiPa = args.length;
        double laenge = Double.parseDouble(args[0]);
                
        System.out.println("=========================================");
        System.out.println("===Variantenuntersuchung einer Stuetze===");
        System.out.println("=========================================");
        

        
        if(KoZeiPa==0) {
            System.out.println("Kommandozeilenparameter fehlen");
            System.out.println("-> -Programmabbruch-");
            System.exit(0);
        }
        int durchmesseranzahl = KoZeiPa-1;
        double durchmFeld [] = new double [durchmesseranzahl];
        double wyFeld [] = new double [durchmesseranzahl];
        double aFeld [] = new double [durchmesseranzahl];
    
        for(i=0; i<durchmesseranzahl; i++){
            durchmFeld[i]=Double.parseDouble(args[i+1]); //+1, weil args[0] ist die Länge, aber wir brauchen Prüfung AB Durchmessereingaben
            durchmesserpruefung(durchmFeld[i]);
        }
        
        Arrays.sort(durchmFeld);
        
        char wahl;
        do {
            eing = JOptionPane.showInputDialog("(A) Berechnung und Ausgabe\n(V) Volumen anzeigen\n***********************************************\n(X) Programm beenden");
            wahl = eing.toUpperCase().charAt(0);

            switch(wahl) {
                case 'A':
                    System.out.println("Variante \t Durchm. [mm] \t Flaeche [mm2] \t\t Widerstandsmoment [mm3]");
                    System.out.println("======================================================================================");
                        for(i=0; i<durchmesseranzahl; i++) {
                            wyFeld[i] = wy(durchmFeld[i]);
                            aFeld[i] = flaeche(durchmFeld[i]);
                            
                            System.out.print("("+(i+1)+")");
                            System.out.print("\t\t "+durchmFeld[i]);
                            System.out.print("\t\t "+aFeld[i]);
                            System.out.print("\t "+wyFeld[i] +"\n");
                        }
                        break;
                        
                case 'V':
                        
                break;
                        
                default:
                    System.out.println("Falsche Eingabe - bitte erneut.");
                break;
                        
                case 'X':
                    System.out.println("Programm beendet.");
                    ende = false;
                    System.exit(0);
                break;
            }
        }
        while(ende);   
        
        System.exit(0);
 

KonradN

Super-Moderator
Mitarbeiter
Bei den Bezeichnern aufpassen:

Wenn ende true ist, dann wird nicht beendet?

Und es ist schon angesprochen: Warum willst Du die Schleife mit Logik verlassen? Du hast doch schon ein System.exit Aufruf. Auf eines der beiden Dinge kannst Du verzichten. Also entweder direkt eine Endlosschleife oder du nimmst das System.exit(0) raus.

Und prüfe noch einmal die Aufgabenstellung: Sind zusätzliche Methoden explizit verboten? Das wäre sehr ungewöhnlich für Aufgaben und macht so nicht wirklich Sinn. Durch das Schreiben einer solchen komplexen Methode lernt man nicht wirklich etwas - außer evtl. schlechte Angewohnheiten.
 

maxmuster987

Aktives Mitglied
Und es ist schon angesprochen: Warum willst Du die Schleife mit Logik verlassen? Du hast doch schon ein System.exit Aufruf. Auf eines der beiden Dinge kannst Du verzichten. Also entweder direkt eine Endlosschleife oder du nimmst das System.exit(0) raus.
Jawohl, hab das System.exit(0) jetzt aus dem case 'X' rausgenommen, habe ich "vergessen". 😜

Nein, explizit verboten sind sie nicht, aber wie gesagt, ich brauche nur die "Grundlagen" von Java, um die Prüfung zu bestehen. Ob das Ganze jetzt optisch schön ist oder nicht, das ist relativ egal hierfür. Klar, strukturierter Code ist immer schöner, aber für mich irrelevant, solange der Code das tut, was gefordert ist.
Und da die Prüfung auch bereits Ende nächsten Monats ist, weiß ich nicht, ob es sinnvoll ist, sich noch intensiver mit den Methoden zu befassen (nicht, dass mir die Zeit am Ende dann fehlt für das "Wichtige").


Für den case 'V' wollte ich etwas in die Richtung schreiben, wie unten abgebildet. Zeile 2-5 soll mir das bringen, dass wenn erst mit Menüpunkt V gestartet wird, darauf hingewiesen wird, dass erst A gewählt werden soll, sodass die Felder der Widerstandsmoment-Berechnungen "gefüllt" sind.

Java:
                case 'V':
                    if(wyFeld[i]==0.0) {
                        System.out.println("Erst mit Menuepunkt A Werte berechnen. -> Programmabbruch");
                        System.exit(0);
                    }
                    String wertStr = JOptionPane.showInputDialog("Fuer welchen Durchmesser sollen die Werte berechnet werden?");
                    double wert = Double.parseDouble(wertStr);
                    for (i; i<durchmesseranzahl; )
                    System.out.println("");
                    System.out.println("Laenge: \t\t " +laenge +" [mm]");
                    System.out.println("=======================================");
                    System.out.println("Durchmesser: \t " );
                    System.out.println("Flaeche Querschnitt: \t ");
                    System.out.println("Volumen des Stabes: \t " );
                    System.out.println("Widerstandsmoment Wy: \t " );
                       
                break;

Zeile 8 ist noch nicht fertig ausgefüllt, hier überlege ich gerade noch, wie das Ganze laufen sollen.
Ich habe in den Anhang gepackt, wie das Endergebnis aussehen soll am Ende.

Länge hole ich mir aus der Kommandozeile.
Durchmesser: Gebe ich ja ein, für welchen ich das Ganze berechnet haben will.
Fläche: Ist ja im Feld hinterlegt, wie greife ich drauf zurück für den entsprechenden Durchmesser?
Volumen: Fläche*Länge
Widerstandsmoment: Ist ja im Feld hinterlegt, wie greife ich drauf zurück für den entsprechenden Durchmesser?
 

Anhänge

  • Java.png
    Java.png
    108 KB · Aufrufe: 2
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Ob das Ganze jetzt optisch schön ist oder nicht, das ist relativ egal hierfür.
Es geht nicht um schön oder nicht. Es geht darum, dass Du funktionierenden Code schreibst. Und wenn Du auf ein Problem stösst: Dass Du dieses eigenständig beheben kannst.
Klar, strukturierter Code ist immer schöner, aber für mich irrelevant, solange der Code das tut, was gefordert ist.
Wenn Du dies ohne so massive Probleme hin kriegen würdest, dann wäre dieser Vorschlag vermutlich nie entstanden.

Was Deinen Code angeht:
  • Wo setzt du denn den Startwert von i? Die Schleife macht so erst einmal wenig Sinn.
  • Wieso brichst Du direkt ab mit einem System.exit? Der Anwender könnte doch in der Schleife bleiben, oder nicht?
 

maxmuster987

Aktives Mitglied
Und wenn Du auf ein Problem stösst: Dass Du dieses eigenständig beheben kannst.
Ja, okay, da hast du Recht.

Wo setzt du denn den Startwert von i? Die Schleife macht so erst einmal wenig Sinn.
bei i=0 setze ich meinen Startwert, das habe ich tatsächlich vergessen einzufügen.

Java:
          for (i=0; i<durchmesseranzahl; i++){

Wieso brichst Du direkt ab mit einem System.exit? Der Anwender könnte doch in der Schleife bleiben, oder nicht?
Du meinst den Teil, oder? Das ist in der Aufgabenstellung nicht weiter beschrieben, deswegen wollte ich bei Fehleingabe also V zuerst - anstatt A - dass dann das Ganze Programm abbricht.

Java:
                    if(wyFeld[i]==0.0) {
                        System.out.println("Erst mit Menuepunkt A Werte berechnen. -> Programmabbruch");
                        System.exit(0);
                    }
 

maxmuster987

Aktives Mitglied
Java:
        case 'V':                                              
              if (wyFeld[0] == 0.0) {
                 System.out.println ("Erst mit Menuepunkt A Werte berechnen -> Programmabbruch");
                System.exit(0);
              }
              for (i=0; i<durchmesseranzahl; i++){
              if(wert == durchmFeld[i]) {
                     System.out.println("");
                    System.out.println("Laenge: \t\t " +laenge +" [mm]");
                    System.out.println("=======================================");
                    System.out.println("Durchmesser: \t " +wert);
                    System.out.println("Flaeche Querschnitt: \t ");
                    System.out.println("Volumen des Stabes: \t " );
                    System.out.println("Widerstandsmoment Wy: \t " );
                       
                 break;
              }
           }

Ich wollte irgendwie in die Richtung gehen, aber weiß nicht, ob ich mit meinem Vorhaben das richtige Ziel finde.
WENN der Wert, den ich eingegeben habe, mit einem Wert aus dem Durchmesserfeld übereinstimmt, dann sollen folgende Werte berechnet weredn.
 

KonradN

Super-Moderator
Mitarbeiter
Ja, okay, da hast du Recht.
Wobei ich vergessen habe zu sagen: Das sind nur Verbesserungsvorschläge. Nur weil ich meine, dass es Dir helfen könnte, muss es Dir nicht helfen. Ich wollte auch nur den Punkt gerade rücken und nicht auf diesem Vorgehen beharren.
bei i=0 setze ich meinen Startwert, das habe ich tatsächlich vergessen einzufügen.

Java:
          for (i=0; i<durchmesseranzahl; i++){
Ja, das sieht dann besser aus - So scheint der Schleifenkopf zu passen.
Du meinst den Teil, oder? Das ist in der Aufgabenstellung nicht weiter beschrieben, deswegen wollte ich bei Fehleingabe also V zuerst - anstatt A - dass dann das Ganze Programm abbricht.

Java:
                    if(wyFeld[i]==0.0) {
                        System.out.println("Erst mit Menuepunkt A Werte berechnen. -> Programmabbruch");
                        System.exit(0);
                    }
Ja, den Part meinte ich. Hier könnte es sinnvoller sein, einfach in der (äußeren) Schleife weiter zu machen - dazu kannst Du Dir ja die Möglichkeiten ansehen, die es da gibt (break und continue wären da die Schlüsselwörter). Das wäre dann an der Stelle auch schon der ganze Vorschlag gewesen.
 

KonradN

Super-Moderator
Mitarbeiter
Ich wollte irgendwie in die Richtung gehen, aber weiß nicht, ob ich mit meinem Vorhaben das richtige Ziel finde.
WENN der Wert, den ich eingegeben habe, mit einem Wert aus dem Durchmesserfeld übereinstimmt, dann sollen folgende Werte berechnet weredn.
Das sieht von der Logik her erst einmal gut aus. Das sollte auch soweit klappen, da alle Werte eingescannten Werten entsprechen.

Hintergrund ist, dass hier Ungenauigkeiten eine Rolle spielen und daher der Vergleich von double Werten mit == nicht unkritisch ist. Um da mit Ungenauigkeiten umzugehen, erlaubt man oft auch geringe Abweichungen. Also a ist ungefähr gleich b wenn | a - b | < e - wenn also der Betrag der Differenz kleiner eines bestimmten Wertes e ist. Aber wie gesagt - das dürfte hier egal sein.
(Siehe dazu z.B. https://seeseekey.net/archive/123720/)
 

Jw456

Top Contributor
Java:
        case 'V':                                            
              if (wyFeld[0] == 0.0) {
                 System.out.println ("Erst mit Menuepunkt A Werte berechnen -> Programmabbruch");
                System.exit(0);
              }
              for (i=0; i<durchmesseranzahl; i++){
              if(wert == durchmFeld[i]) {
                     System.out.println("");
                    System.out.println("Laenge: \t\t " +laenge +" [mm]");
                    System.out.println("=======================================");
                    System.out.println("Durchmesser: \t " +wert);
                    System.out.println("Flaeche Querschnitt: \t ");
                    System.out.println("Volumen des Stabes: \t " );
                    System.out.println("Widerstandsmoment Wy: \t " );
                     
                 break;
              }
           }

Ich wollte irgendwie in die Richtung gehen, aber weiß nicht, ob ich mit meinem Vorhaben das richtige Ziel finde.
WENN der Wert, den ich eingegeben habe, mit einem Wert aus dem Durchmesserfeld übereinstimmt, dann sollen folgende Werte berechnet weredn.
Willst du wirklich das das Programm zu Ende ist in Zeile 4?
Da würde wohl ein else sinvoll sein. Und dort deine for Schleife starten.


System.exit(0); beedet das Programm
Du willst ja das der User erst Punkt A ausfürt das sagst du ihm zumindestens.
 

maxmuster987

Aktives Mitglied
Wie seid ihr mit diesem Versuch einverstanden?
Zeile 61, 75, 79 sind für mich aber noch nicht ganz klar irgendwie. Das habe ich aus dem Skript irgendwie blind eingefügt ohne wirklich zu wissen, warum das eigentlich funktioniert.

Zweiter Punkt: Wenn ich jetzt das Programm ausführe ohne Eingabe irgendwelcher Kommandozeilenparameter, dann erhalte ich eine Fehlermeldung, die wie folgt lautet:

Exception in thread "main" java.lang.Array.IndexOutOfBoundsException: Index 0 out of bounds for length 0 at Uebung.main(Uebung.java: 11)

Also es wird um die Zeile 11 double laenge = Double.parseDouble(args[0]); gehen.




Java:
import java.io.*;
import javax.swing.*;
import java.util.*;

public class Uebung {
    public static void main (String[] args) {
        boolean ende = true;
        int i=0;
        String eing="";
        int KoZeiPa = args.length;
        double laenge = Double.parseDouble(args[0]);
        int durchmesseranzahl = KoZeiPa-1;
        double durchmFeld [] = new double [durchmesseranzahl];
        double wyFeld [] = new double [durchmesseranzahl];
        double aFeld [] = new double [durchmesseranzahl];
               
        System.out.println("=========================================");
        System.out.println("===Variantenuntersuchung einer Stuetze===");
        System.out.println("=========================================");
       

       
        if(KoZeiPa==0) {
            System.out.println("Kommandozeilenparameter fehlen");
            System.out.println("-> -Programmabbruch-");
            System.exit(0);
        }

        for(i=0; i<durchmesseranzahl; i++){
            durchmFeld[i]=Double.parseDouble(args[i+1]); //+1, weil args[0] ist die Länge, aber wir brauchen Prüfung AB Durchmessereingaben
            durchmesserpruefung(durchmFeld[i]);
        }
       
        Arrays.sort(durchmFeld);
       
        char wahl;
        do {
            eing = JOptionPane.showInputDialog("(A) Berechnung und Ausgabe\n(V) Volumen anzeigen\n***********************************************\n(X) Programm beenden");
            wahl = eing.toUpperCase().charAt(0);

            switch(wahl) {
                case 'A':
                    System.out.println("Variante \t Durchm. [mm] \t Flaeche [mm2] \t\t Widerstandsmoment [mm3]");
                    System.out.println("======================================================================================");
                        for(i=0; i<durchmesseranzahl; i++) {
                            wyFeld[i] = wy(durchmFeld[i]);
                            aFeld[i] = flaeche(durchmFeld[i]);
                           
                            System.out.print("("+(i+1)+")");
                            System.out.print("\t\t "+durchmFeld[i]);
                            System.out.print("\t\t "+aFeld[i]);
                            System.out.print("\t "+wyFeld[i] +"\n");
                        }
                break;

                case 'V':                                              
                    if (wyFeld[0] == 0.0) {
                        System.out.println ("Erst mit Menuepunkt A Werte berechnen -> Programmabbruch");
                        break;
                    }
                    boolean merker = true;    
                                   
                    String wertStr = JOptionPane.showInputDialog ("Fuer welchen Durchmesser soll das Volumen angezeigt werden ?");
                    double wert = Double.parseDouble(wertStr);
                    for (i=0; i<durchmesseranzahl; i++){
                        if (wert == durchmFeld[i]) {
                            System.out.println("");
                            System.out.println("Laenge:\t\t\t" + laenge + " [mm]");
                            System.out.println("==================================================");
                            System.out.println("Durchmesser:\t\t" + durchmFeld[i] + " [mm]");
                            System.out.println("Flaeche Querschnitt:\t" + aFeld[i] + " [mm2]");
                            System.out.println("Volumen des Stabes:\t" + (aFeld[i]*laenge) + " [mm3]");
                            System.out.println("Widerstandsmoment Wy:\t" + (wyFeld[i]) + " [mm3]");
                            System.out.println("==================================================");
                            merker = false;
                            break;              
                        }
                    }
                    if (merker)
                    System.out.println("Durchmesser nicht enthalten");
                break;      
       
                default:
                    System.out.println("Falsche Eingabe - bitte erneut.");
                break;
                       
                case 'X':
                    System.out.println("Programm beendet.");
                    ende = false;
                    System.exit(0);
                break;
            }
        }
        while(ende);  
       
        System.exit(0);  
    }

    //METHODEN
    public static void durchmesserpruefung(double durchmFeld) {
        if(durchmFeld<100 | durchmFeld>250) {
            System.out.println("Achtung: Durchmesser " +durchmFeld +" [mm] unegueltig -> Programmabbruch");
            System.exit(0);
        }
    }
   
    public static double wy(double durchmFeld){
        double wy = Math.PI*(Math.pow(durchmFeld/2.,3)/8);
        return wy;
    }
   
    public static double flaeche(double durchmFeld) {
        double a = (Math.PI/8.)*Math.pow(durchmFeld, 2);
        return a;
    }
   
}
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Bezüglich dem Aufruf ohne Parameter:
In den Zeilen 23-27 behandelst Du den Fall, dass keine Parameter angegeben wurden.
In Zeile 11 greifst Du aber bereits auf den ersten Parameter zu.

Die Prüfung, ob Parameter vorhanden sind, muss natürlich erfolgen, ehe Du auf irgend welche Parameter zugreifst.

Und der Fehler wird auch das erste Programm gehabt haben, denn da ist es auch nicht anders.
 

Jw456

Top Contributor
Du hast zwar eine Prüfung ob Parameter übergeben wurden in Zeile 23 bis 26 das solltest du aber am Anfang machen.
Ab Zeile 10
 

maxmuster987

Aktives Mitglied
Und der Fehler wird auch das erste Programm gehabt haben, denn da ist es auch nicht anders.
Jawohl, da habe ich anscheinend die Programme vertauscht. Ich hab mich auf ein anderes anscheinend bezogen, hier hatte es logischerweise auch nicht funktioniert.

Die Prüfung, ob Parameter vorhanden sind, muss natürlich erfolgen, ehe Du auf irgend welche Parameter zugreifst.
Du hast zwar eine Prüfung ob Parameter übergeben wurden in Zeile 23 bis 26 das solltest du aber am Anfang machen.
Ab Zeile 10

Das habe ich jetzt gemacht und nun funktioniert es.


Tipp mache dir mal klar was das break in dem switch macht.
Sobald break eintritt, komme ich wieder in die äußere Schleife hinein, also da, wo ich nach (A), (V) und (X) abgefragt werde.
Ps was soll der Merker denn brauchst du nicht.
Wie meinst du das? Dann läuft doch aber das Programm nicht, wenn ich den merker entferne?!😕
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T error: class, interface, or enum expected Java Basics - Anfänger-Themen 5
D Compiler-Fehler error: .class expected Java Basics - Anfänger-Themen 2
L Compiler-Fehler error: class, interface or enum expected Java Basics - Anfänger-Themen 2
FHEFHJHFJH error: class names, 'summe_bsp', are only accepted if annotation processing is explicitly requested Java Basics - Anfänger-Themen 3
F Taschenrechner "Error loading class..." Java Basics - Anfänger-Themen 5
B Linux - Error: Could not find or load main class application.Main Java Basics - Anfänger-Themen 28
D error: Class names, >>>HILFE, anfänger<<< Java Basics - Anfänger-Themen 4
I Exception wird gefangen, aber trotzdem in Error Log? Java Basics - Anfänger-Themen 10
terashy VS Code Project run error Java Basics - Anfänger-Themen 10
monsterherz Circle.java:5: error: <identifier> expected Java Basics - Anfänger-Themen 2
monsterherz error: <identifier> expected Java Basics - Anfänger-Themen 2
R Compiler-Fehler identifier error? Java Basics - Anfänger-Themen 3
N Compiler-Fehler Not a statement Error Java Basics - Anfänger-Themen 7
Jul1n4tor Scanner error bei Eingabe die kein Integer ist Java Basics - Anfänger-Themen 4
richrich99 error: illegal start of expression Java Basics - Anfänger-Themen 10
N Compiler-Fehler State Machine - Compiler Error Java Basics - Anfänger-Themen 48
U Interface als PAramter (Vergleich) und ein Error Java Basics - Anfänger-Themen 9
S JavaKara Null Exception Error Java Basics - Anfänger-Themen 4
P Eclipse Karate Framework API Test . Unexpected Error: the trustAnchors parameter must be non-empty Java Basics - Anfänger-Themen 1
H Versteht jemand diesen Codewars Error? Java Basics - Anfänger-Themen 8
J Fehlermeldung: A JNI error Java Basics - Anfänger-Themen 3
Gaudimagspam Compiler Error Java Basics - Anfänger-Themen 3
Eule25 Arbeit mit long und int, Error: integer number too large Java Basics - Anfänger-Themen 2
P Welche Zeile in Tadople gibt einen compiler error? Java Basics - Anfänger-Themen 5
B Methoden if-statement error, FX, Fehlermeldung Java Basics - Anfänger-Themen 6
K Error bei meinem Programm - Hilfe Java Basics - Anfänger-Themen 8
A Scanner-Error Java Basics - Anfänger-Themen 8
Elyt Error: incompatible types Java Basics - Anfänger-Themen 3
I Client ObjectInputStream error... Java Basics - Anfänger-Themen 5
Kirby.exe Alle möglichen Error Möglichkeiten abfangen Java Basics - Anfänger-Themen 33
C error: <identifier> expected Java Basics - Anfänger-Themen 13
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
N Methoden Unerklärliche Error Meldung Java Basics - Anfänger-Themen 3
ZH1896ZH Datentypen Error bei For-Schleife Java Basics - Anfänger-Themen 2
R Error, wenn mehrere Clients gleichzeitig die Verbindung beenden Java Basics - Anfänger-Themen 16
Z Klassen Error: ';' expected - was mache ich falsch? Java Basics - Anfänger-Themen 4
9 Error bei .split() Java Basics - Anfänger-Themen 2
L Operatoren error: bad operand types for binary operator && Java Basics - Anfänger-Themen 8
B cal4j - Error at line 1:Unexpected end of file Java Basics - Anfänger-Themen 0
F Erste Schritte error: cannot find symbol Java Basics - Anfänger-Themen 5
L SQLITE - Syntax error Java Basics - Anfänger-Themen 3
R else without if error Java Basics - Anfänger-Themen 5
A Objekt in Methode zurückgeben, JUnit zeigt Error Java Basics - Anfänger-Themen 2
F Ausdruck wirft unerwarteten Error Java Basics - Anfänger-Themen 2
T Unverständlicher Launch-Error Java Basics - Anfänger-Themen 11
L Bluej Error: Cannot find Symbol Java Basics - Anfänger-Themen 13
R java.lang.ArrayIndexOutOfBoundsException: 0 Rechner Error Java Basics - Anfänger-Themen 4
T Error: int cannot be dereferenced Java Basics - Anfänger-Themen 10
D Datentypen Datentyperstellung | Kompiler sagt Syntax Error doch ich find keine Lösung Java Basics - Anfänger-Themen 2
J Syntax error on token ";",, expected Java Basics - Anfänger-Themen 2
W double*double error Java Basics - Anfänger-Themen 4
C Compiler-Fehler No such Field error Java Basics - Anfänger-Themen 20
T Datum wird auf der Konsole richtig ausgegeben, aber im Textarea kommt ERROR Java Basics - Anfänger-Themen 8
C Erste Schritte Syntax Error Java Basics - Anfänger-Themen 23
H Variablen error: non-static variable cannot be referenced from a static context Java Basics - Anfänger-Themen 4
H Compiler-Fehler error not a statement Java Basics - Anfänger-Themen 2
N Error bei eingabe eines Punktes Java Basics - Anfänger-Themen 1
TheMenox Error bei Scanner - woher? Java Basics - Anfänger-Themen 14
Chr1s Interpreter-Fehler Error Fehlercode Java Basics - Anfänger-Themen 7
D Bitte um Hilfe bei "error: package com.apple.eawt does not exist import com.apple.eawt.*;" Java Basics - Anfänger-Themen 1
J Error: cannot find symbol - variable Java Basics - Anfänger-Themen 3
S Compiler-Fehler error: ';' expected (finde Fehler nicht) Java Basics - Anfänger-Themen 10
D Erste Schritte Fehlermeldung "Syntax error on token ";", { expected after this token" Java Basics - Anfänger-Themen 13
1 Bei if-Anweisung: Syntax error on token Java Basics - Anfänger-Themen 5
D Übung Felder java Error kompilieren Java Basics - Anfänger-Themen 4
Joew0815 Error org.apache.xmlrpc.client.XmlRpcClientConfigImpl.setUserAgent Java Basics - Anfänger-Themen 2
A Code läuft nicht, Fehlermeldung Exception in thread "main" java.lang.Error: Unresolved compilation " Java Basics - Anfänger-Themen 11
C Exception Error Java Basics - Anfänger-Themen 15
A Heap Space Error bei rekursiver Suche in Dateien trotz nur einer Zeile im Speicher Java Basics - Anfänger-Themen 26
B Not a statement error Java Basics - Anfänger-Themen 2
D error: cannot find symbol Java Basics - Anfänger-Themen 3
B Frage zu Beispielprogramm: "error: cannot find symbol" Java Basics - Anfänger-Themen 2
F java Ip ping + Dateiausgabe error ! Java Basics - Anfänger-Themen 3
O Exception Error Java Basics - Anfänger-Themen 3
BlueMountain Erste Schritte error: cannot find symbol Java Basics - Anfänger-Themen 2
B Printf führt zu Error. Java Basics - Anfänger-Themen 8
P Fatal Error [...] librxtxSerial.so Java Basics - Anfänger-Themen 2
L Error: Cannot find symbol Java Basics - Anfänger-Themen 1
A Taschenrechner zeigt Error Java Basics - Anfänger-Themen 7
B Compiler-Fehler 86:11: error: ';' expected obwohl kein ";" hingehört! Java Basics - Anfänger-Themen 10
K Java-Editor: "Starten" bringt Error Java Basics - Anfänger-Themen 15
N Error "unreachable Code" Java Basics - Anfänger-Themen 7
A error: incompatible types Java Basics - Anfänger-Themen 9
T If ; else error on system token delete Java Basics - Anfänger-Themen 5
B Error vs Runtime exception Java Basics - Anfänger-Themen 4
W Variablen While-Error Java Basics - Anfänger-Themen 6
N Operatoren JSpinner und + Error Java Basics - Anfänger-Themen 21
M Java Arbeitsspeicherverbrauch, Heap Space error korrigieren? Java Basics - Anfänger-Themen 18
D Error bei addView Java Basics - Anfänger-Themen 4
M Syntax error on token ";", { expected after this token Java Basics - Anfänger-Themen 3
J Variablen Invalid Character - Error -> Spiel mit Variablenergebnissen Java Basics - Anfänger-Themen 8
K Erste Schritte eclipse syntax error token Java Basics - Anfänger-Themen 5
vandread String.split("\\") führt zu Error?! Java Basics - Anfänger-Themen 8
G Fehlermeldung: A fatal error has been detected by the Java Runtime Environment Java Basics - Anfänger-Themen 7
B Compiler-Fehler import java.io.*; führt zu error Java Basics - Anfänger-Themen 2
S Syntax Error - source level Java Basics - Anfänger-Themen 12
L bean error bei glassfish deploy Java Basics - Anfänger-Themen 2
B Syntax error Java Basics - Anfänger-Themen 6
K Error: java.lang.NoSuchMethodException Java Basics - Anfänger-Themen 2
K Objekt erstellen - error: non-static variable this cannot be referenced from a static context Java Basics - Anfänger-Themen 17

Ähnliche Java Themen

Neue Themen


Oben