# Fehler in Programm



## Dilay123 (5. Jan 2021)

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



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





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


----------



## kneitzel (5. Jan 2021)

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 next*Line*:

```
a = Double.parseDouble(scn.nextLine());
```

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


----------



## kneitzel (5. Jan 2021)

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!


----------



## Dilay123 (5. Jan 2021)

Aber leider taucht immernoch beim ausführen ein Fehler auf


----------



## kneitzel (5. Jan 2021)

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


```
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 (5. Jan 2021)

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 ?


----------



## kneitzel (5. Jan 2021)

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

Die Logik macht so erst einmal keinen Sinn.


----------



## Dilay123 (5. Jan 2021)

Mir fällt leider keine alternative ein ich sitz schon seit gestern dran.


----------



## kneitzel (5. Jan 2021)

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.


----------

