public void print_Menu()
{
int Nummer;
System.out.println();
System.out.println("MENÜ");
System.out.println(" Auswahloptionen:\t\t\t");
System.out.println("1) Double Werte eingeben\t\t\t");
Scanner sc= new Scanner (System.in);
Nummer=sc.nextInt(); //hier wäre die Problemstelle
switch(Nummer){
//Double Werte eingeben
case 1:
Werte_eingeben();
// zeige menü
print_Menu();
return;
case 2:
System.out.println("Hallo");
default:
print_Menu();
}}
public void Werte_eingeben(){
double k=2;
int i=-1;
i++;
System.out.println("Bitte geben Sie eine Double Zahl ein");
k=Zahl_in_Double();
System.out.println(k+" Die eingegebene Zahl");
}
public double Zahl_in_Double(){
double d=0;
String l=uebergebeString();
try {
d = Double.valueOf(l);
} catch (NumberFormatException e) {}
double obere_Grenze=999;
double untere_Grenze=-999;
if (obere_Grenze>d && untere_Grenze<d)
{return d;}
else {System.out.println("Die Zahl ist nicht innerhalb des Wertebereich");
d=0;
return d;
}
}
public String uebergebeString(){
BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
{
String m;
//System.out.println("Bitte, geben Sie ein Verzeichnis ein.");
//System.out.println("z.B. C:/Dokumente/");
m="";
try
{
m = buffer.readLine();
}
catch(IOException a)
{
a.printStackTrace();
}
finally
{
try
{
buffer.close();
}
catch(IOException a){
}
}
return m;}}
}
[/Java]
Hallo,
ich komme einfach nicht weiter. Das Programm wird richtig ausgeführt jedoch wenn ich dann versuche
Doublewerte einzugeben, bekomme ich folgende Fehlermeldung:
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at EinAus.print_Menu(EinAus.java:20)
at EinAus.print_Menu(EinAus.java:27)
at Matrix.main(Matrix.java:10)
Warum springt Java zuerst zu case? und wie kann ich das verhindern?
Das ist das Menü, aber habe ich bei der * Formatierung auch gedacht, dass es die Eingabe ist ... das Program funktioniert bei mir korrekt.
Code:
Bitte geben Sie eine Double Zahl ein
4.0
4.0 Die eingegebene Zahl
MENÜ
Auswahloptionen:
1) Double Werte eingeben
1
Bitte geben Sie eine Double Zahl ein
4.0
4.0 Die eingegebene Zahl
MENÜ
Auswahloptionen:
1) Double Werte eingeben
2
Hallo
MENÜ
Auswahloptionen:
1) Double Werte eingeben
1
Bitte geben Sie eine Double Zahl ein
4,0
0.0 Die eingegebene Zahl
Warum ist der Name unangemessen???:L Wenn kein case zutrifft, dann wird ausnahmsweise der default-Zweig geladen. In diesen sollte man eignetlich nur in "Notsituationen" springen, falls die Eingabe nicht korrekt ist.
Die Ausnahmebehandlung wird in einem try-catch-Block abgewickelt.
Und der else-Zweig einer if-Anweisung ist auch kein Zweig der nur ausnahmsweise betreten wird, sondern schon regulär.
Ist vielleicht etwas spitzfindig und fern ab vom Thema. Ich wollts nur noch mal verdeutlichen.
Hallo,
danke für die vielen Antworten aber bei mir geht der Quelltext immer noch nicht,
So sieht die Fehlermeldung aus:
MENÜ
Auswahloptionen:
1) Double Werte eingeben
1
Bitte geben Sie eine Double Zahl ein
4.0
4.0 Die eingegebene Zahl
MENÜ
Auswahloptionen:
1) Double Werte eingeben
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at EinAus.print_Menu(EinAus.java:20)
at EinAus.print_Menu(EinAus.java:27)
at Matrix.main(Matrix.java:10)
Mit dem Fehler "java.util.NoSuchElementException" kann ich so nix anfangen, soll ich dies bei den Scanner einbringen?
Ich habe versucht mit
sc.close();
den Scanner zu schließen, aber das bringt dannn Fehlermeldungen beim Bufferreader.
Wie könnte man verhindern das wenn die DoubleZahl eingegeben ist, das Menü neu ausgegeben, der Scanner sofort eine Zahl haben will (und nicht einfach wartet bis man eine Zahl eingegeben hat) oder liegt das Problem woanders?
Ansonsten hat sich an der Klasse, wo das Problem ist nix geändert.
Java:
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.util.Scanner;importjava.util.NoSuchElementException;import algoj.IOUtils;publicclassEinAus{publicvoidprint_Menu(){intNummer;System.out.println();System.out.println("MENÜ");System.out.println(" Auswahloptionen:\t\t\t");System.out.println("1) Double Werte eingeben\t\t\t");Scanner sc=newScanner(System.in);Nummer=sc.nextInt();switch(Nummer){//Double Werte eingebencase1:Werte_eingeben();// zeige menüprint_Menu();return;case2:System.out.println("Hallo");default:print_Menu();}}publicvoidwaitForUser(){System.out.println("\nDrücken Sie eine beliebige Taste, um ins Menü zurückzukehren.");IOUtils.readString();}publicvoidWerte_eingeben(){double k=2;int i=-1;
i++;System.out.println("Bitte geben Sie eine Double Zahl ein");
k=Zahl_in_Double();System.out.println(k+" Die eingegebene Zahl");}publicdoubleZahl_in_Double(){double d=0;String l=uebergebeString();try{
d =Double.valueOf(l);}catch(NumberFormatException e){}double obere_Grenze=999;double untere_Grenze=-999;if(obere_Grenze>d && untere_Grenze<d){return d;}else{System.out.println("Die Zahl ist nicht innerhalb des Wertebereich");
d=0;return d;}}publicintuebergebe_int(){BufferedReader buffer =newBufferedReader(newInputStreamReader(System.in));int i=0;try{
i =Integer.parseInt(buffer.readLine());// d = Double.parseDouble(buffer.readLine());}catch(IOException e){
e.printStackTrace();}finally{try{
buffer.close();}catch(IOException e){}}return i;}publicStringuebergebeString(){BufferedReader buffer =newBufferedReader(newInputStreamReader(System.in));{String m;//System.out.println("Bitte, geben Sie ein Verzeichnis ein.");//System.out.println("z.B. C:/Dokumente/");
m="";try{
m = buffer.readLine();}catch(IOException a){
a.printStackTrace();}finally{try{
buffer.close();}catch(IOException a){}}return m;}}}
ich habe jetzt zugegebenermaßen nicht versucht, den gesamten Code zu durchblicken, aber mir ist aufgefallen, dass am Ende von "case2" das return fehlt, wodurch Du generell in den default-Fall kommst!
Der Code war extrem schwer zu lesen! Je Anweisung nur eine Zeile benutzen!
Klammersetzung vereinheitlichen!
Code in CamelCase!
Variablen- und Methodennamen klein!
Hab mal was Funktionierendes daraus gemacht:
Java:
importjava.io.*;importjava.util.*;//import algoj.IOUtils; //braucht kein Mensch! Du hast bereits den tollen Scanner!publicclassEinAus{privateScanner scanner;publicEinAus(){
scanner =newScanner(System.in);}publicvoidprint_Menu(){int nummer;System.out.println();System.out.println("MENÜ");System.out.println(" Auswahloptionen:\t\t\t");System.out.println("1) Double Werte eingeben\t\t\t");System.out.println("2) \"Hallo\" ausgeben\t\t\t");System.out.print("\n> ");
nummer=scanner.nextInt();switch(nummer){//Double Werte eingebencase1:werteEingeben();// zeige menüprint_Menu();break;case2:System.out.println("Hallo");print_Menu();break;default:print_Menu();}}publicvoidwaitForUser(){System.out.println("\nDrücken Sie eine beliebige Taste, um ins Menü zurückzukehren.");//IOUtils.readString(); //brauchst nicht! Hast den Scanner!uebergebeString();}publicvoidwerteEingeben(){double k =0;//int i= -1;//i++;System.out.print("Bitte geben Sie eine Double Zahl ein. > ");
k =zahlInDouble();System.out.println("Ihre Eingabe war: "+k);}publicdoublezahlInDouble(){double d=0;String l=uebergebeString();try{
d =Double.valueOf(l);}catch(NumberFormatException e){System.out.println("Eingabe war keine Zahl!");}double obere_Grenze=999;double untere_Grenze=-999;if(d > obere_Grenze || d < untere_Grenze){System.out.println("Die Zahl ist außerhalb des gültigen Wertebereichs (-999 bis 999)!");//d=0;}return d;}publicintuebergebe_int(){//BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));int i = scanner.nextInt();/*try {
i = Integer.parseInt(i);
// d = Double.parseDouble(buffer.readLine());
}
catch(IOException e) {
e.printStackTrace();
}
finally {
try {
buffer.close();
}
catch(IOException e){
e.printStackTrace();
}
} */return i;}publicStringuebergebeString(){/*String m;
//System.out.println("Bitte, geben Sie ein Verzeichnis ein.");
//System.out.println("z.B. C:/Dokumente/");
m="";
try {
m = buffer.readLine();
}
catch(IOException a) {
a.printStackTrace();
}
finally {
try {
buffer.close();
}
catch(IOException a) {
a.printStackTrace();
}
}*/return scanner.next();}}
Es geht dir also um das hier?
[JAVA=7] private Scanner scanner;
public EinAus() {
scanner = new Scanner(System.in);
}[/code]
In Zeile 7 deklariere ich eine nur in dieser Klasse sichtbare Referenz (bzw. Instanzvariable) auf ein Scanner-Objekt. Die Variable kann von jeder Code-Stelle aus innerhalb dieser Klasse genutzt werden.
Zeile 9-11 nennt man Konstruktormethode, eine Methode, die beim Instanziieren einer Klasse einmal aufgerufen wird und Variablen auf Startwerte setzt.
Und nichts anderes wird da auch in Zeile 10 gemacht. Dort definiere ich ein Scanner-Objekt und weise es der oben deklarierten Scanner-Referenz zu.
Nur eine Verständnisfrage, wenn also beim 2. Durchlauf er wieder zur Stelle
[JAVA=21] nummer=scanner.nextInt();[/code]
kommt. Dann setzt er jedesmal den Scanner wieder auf den Startwert zurück?
Der Scanner ruft dann nur seine Methode nextInt() auf. Dafür brauchst du nicht immer wieder ein neues Scanner-Objekt, sondern kannst das bereits bestehende (Instanzvariable) nutzen.