Fehler in Programm

Dilay123

Mitglied
Hey Leute, das ist mein Programm ich muss einen spezifischen Wiederstand berechnen, aber ich finde leider mein Fehler da unten nd.


Java:
import java.util.Scanner;
public class SpezifischerWiderstand {

    public static void main(String[] args) {

        double r = 0; // Leitwiderstand
        double a = 0; // Querschnittsfläche
        double l = 0; // Länge des Leiters
        double p = 0; // spezifischer Widerstand Rho
        int d=0;       //Hilfsvariable
        String s="stoffe";
        Scanner scn = new Scanner(System.in);

        while(d==0)
        {
            try {
   
                System.out.println("Länge des Leiters angeben: ");
                l = Double.parseDouble(scn.next());

                System.out.println("Querschnittsfläche angeben:");
                a = Double.parseDouble(scn.next());
   
                System.out.println("Wählen Sie einen Stoff:\n(a)Aluminium\n(b)Eisen\n(c)Gold\n(d)Kupfer\n(e)Silber");
                s= scn.next();
       
                while(d==0)
                {

                    switch (s) {
               
                                case "a":
                                    {
                                    System.out.println("a)Aluminium");
                                    System.out.println("0,028\n");
                                    p = 0.028;
                                    }
                                    break;
                       
                                case "b":
                                    {
                                    System.out.println("b)Eisen:");
                                    System.out.println("0,097\n");
                                    p = 0.097;
                                    }
                                    break;
                       
                                case "c":
                                    {
                                    System.out.println("c)Gold:");
                                    System.out.println("0,023\n");
                                    p = 0.023;
                                    }
                                    break;
                       
                                case "d":
                                    {
                                    System.out.println("d)Kupfer:");
                                    System.out.println("0,017\n");
                                    p = 0.017;
                                    }
                                    break;
                       
                                case "e":
                                    {
                                    System.out.println("e)Silber:");
                                    System.out.println("0,016\n");
                                    p = 0.016;
                                    }
                                    break;
                       
                                default:
                                {
                                System.out.println("Falsche Eingabe");
                                }
                       
                            }
                    System.out.print("Fehler,gib es nochmal ein:");
                    d=scn.nextInt();
                    d++;
            }
r=(p*l/a);
        System.out.println("R="+r);
        d++;
        }

        catch (Exception e)
        {
            d=0;
            System.out.println("Fehler, gib es nochmal ein:");
        }
        scn.close();
}
}
}


Wenn ich es ausführe und was falsches eigebe kommt die ganze Zeit wiederholt
Code:
Falsche Eingabe 

Fehler,gib es nochmal ein:  

Länge des Leiters angeben:

100

Querschnittsfläche angeben:

200

Wählen Sie einen Stoff:

(a)Aluminium

(b)Eisen

(c)Gold

(d)Kupfer

(e)Silber

q

Falsche Eingabe

Fehler,gib es nochmal ein:










LG und Danke
 
Zuletzt bearbeitet von einem Moderator:
K

kneitzel

Gast
Das war doch bereits Thema im anderen Thread. Da muss man doch keinen neuen Thread aufmachen!

Und da wurden Dir zwei Lösungen vorgeschlagen. Und eine der Lösungen war die Verwendung von nextLine:
Java:
a = Double.parseDouble(scn.nextLine());

Die ausführlichen Erläuterungen muss man nicht erneut bringen denke ich mal ...
 
K

kneitzel

Gast
Ok, hier habe ich die Threads verwechselt. Das war nicht bei Deinem Thread sondern in einem anderen.

Und Dein Problem scheint zu sein: scn.close();
Einen Scanner auf System.in schließt Du nicht! Scanner zu schließen schließt auch den zugrunde liegenden Stream, d.h. die Standardeingabe der Programmes wird geschlossen und weitere Eingaben sind nicht mehr möglich!
 
K

kneitzel

Gast
Also Du schließt den scanner nun nicht mehr?

Und was für Fehler treten jetzt noch auf?

Generell verstehe ich auch nicht die Logik von Deinem

Java:
                    d=scn.nextInt();
                    d++;

Du Fragst nach etwas, das entweder double oder String ist und dann kommt nur ein "Fehler, gib es nochmal ein" und erwartest dann ein int?
Und das kommt nach der Switch Anweisung, also egal, was Du eingegeben hast, der Code geht da durch ...
 

Dilay123

Mitglied
Ja ich schließe den Scanner nicht mehr.

Also beim ausführen, geb ich beispielsweise etwas ein und es kommt die ganze zeit ohe pause Falsche eingabe.

Sollte ich statt nextInt(); ein nextDouble(); nehmen ?
 
K

kneitzel

Gast
Überlege Dir erst einmal die Logik. Wann soll was eingegeben werden?

Die Logik macht so erst einmal keinen Sinn.
 
K

kneitzel

Gast
Das Problem ist somit doch einfach, dass Du ein Problem als Ganzes lösen willst, das zu komplex ist, um (von Dir) überschaut zu werden.

Da hilft nur eins: Teile und Herrsche!

Also teil es in mehrere Methoden auf!

Eingabe erfolgt einfach immer über eine Methode - also bau Methoden wie getDouble(String message) und getMetal().

Dann ist die ganze Problematik mit falschen Eingaben in kleinen Methoden abzuhandeln und dürfte dann einfacher zu überschauen sein.

Dann hast Du eine Methode queryAndCalculate - diese Methode fragt nach den einzelnen Werten und berechnet draus den Wert.

Und dann kannst Du gerne noch eine Schleife bauen, die queryAndCalculate() in einer Schleife abruft. Danach per getBoolean(String message) nachfragt, ob noch eine Berechnung erfolgen soll oder nicht ...

==> So hast Du viele einzelne Teile, die jedes für sich eine kleinere Komplexität hat und die Du viel einfacher hin bekommen kannst.
 

Neue Themen


Oben