We behandele ich diese Exception?

nossek

Aktives Mitglied
Guten Tag,

derzeit beschäftige ich mich erstmals mit Exceptions. Habe mir ein sehr einfaches Beisiel überlegt, nur leider funktioniert es noch nicht:
Java:
import java.util.Scanner;
import java.io.IOException;

public class Main {

    public static void main(String[] args) {

        int i = 1;
        Scanner scanner = new Scanner(System.in);
 
        while(i != 0 ){
            try{System.out.println("Bitte geben sie eine Zahl ein. 0 beendet das Programm.");
                i = scanner.nextInt();
                System.out.println("Sie haben die Zahl "  +i +" eingegeben");
            }
            catch(Exception e){
                System.out.println("Ihre Eingabe war fehlerhaft. Bitte versuchen Sie es erneut.");             
            }   
        }
        
    }
}
Hier fehlt etwas, das ist klar. Die Ausnahme wird ja garnicht behandelt. Derzeit wird bei einer fehlerhaften Eingabe die while schleife endlos weiter ausgeührt, ohne daß eine erneute Eingabe möglich ist (Wieso eigentlich?). Ich dachte zunächst, die Lösung sei, im catch-block der Variable i irgendeinen zulässigen Wert zuzuweisen, das führt aber zum selben Ergebnis.

Wie behandle ich diese Ausnahme korrekt?

Grüße nossek
 
S

sowieso2

Gast
public class Main {

public static void main(String[] args) {

int i = 1;
boolean bedingung = true;
Scanner scanner = new Scanner(System.in);

while(bedingung){
try{System.out.println("Bitte geben sie eine Zahl ein. 0 beendet das Programm.");
i = scanner.nextInt();
if( i == 0)
break; // oder bedingung = false;
System.out.println("Sie haben die Zahl " +i +" eingegeben");
}
catch(Exception e){
System.out.println("Ihre Eingabe war fehlerhaft. Bitte versuchen Sie es erneut.");
}
}

}
}
 
S

sowieso2

Gast
Oops
Java:
 	 public class Main {

public static void main(String[] args) {

int i = 1;
boolean bedingung = true;
Scanner scanner = new Scanner(System.in);

while(bedingung){
try{System.out.println("Bitte geben sie eine Zahl ein. 0 beendet das Programm.");
i = scanner.nextInt();
if( i == 0)
break; // oder bedingung = false;
System.out.println("Sie haben die Zahl " +i +" eingegeben");
}
catch(Exception e){
System.out.println("Ihre Eingabe war fehlerhaft. Bitte versuchen Sie es erneut.");
}
}

}
}
 

Flown

Administrator
Mitarbeiter
Ich glaub du meintest so:

Java:
import java.util.Scanner;


public class Test {

	public static void main(String[] args) {
		int i = 1;
        Scanner scanner = new Scanner(System.in);
 
        while(i != 0 ){
            try{System.out.println("Bitte geben sie eine Zahl ein. 0 beendet das Programm.");
                i = scanner.nextInt();
                System.out.println("Sie haben die Zahl "  +i +" eingegeben");
            }
            catch(Exception e){
                System.out.println("Ihre Eingabe war fehlerhaft. Bitte versuchen Sie es erneut.");
                scanner = new Scanner(System.in);
            }   
        }
	}
}
 
S

SlaterB

Gast
@sowieso2
das ändert doch nix, die Bedingung sitzt schon an der richtigen Stelle,
Problem ist hierbei, dass die fehlerhafte andere Eingabe im Scanner verbleibt,
ein scanner.nextLine(); räumt in Fehlerfall auf

komplizierte Klasse..

edit:
ständig
> scanner = new Scanner(System.in);
ist nicht schön..
 

Ark

Top Contributor
Das Problem ist, dass die Eingabe beim Scanner nach wie vor verfügbar ist (bei einem Fehler schreitet der Scanner nicht in der Eingabe voran) und er deshalb immer wieder dieselbe eingegebene Zeichenkette umzusetzen versucht.

Ark
 

nossek

Aktives Mitglied
Mensch seid ihr schnell!

@final-striker:
klar, die Fehlermeldung kommt, es ging darum nach der fehlerhaften Eingabe eine neue Eingabe zu ermöglichen.

@sowieso2:
Dein Beispiel zeigt das gleiche Verhalten (nach fehlerhafter Eingabe wird die Schleife endlos durchlaufen ohne weitere Eingabemöglichkeit). Aber Du hast wohl Recht damit daß die Schleifenbedingung besser ein boolean sein sollte.

@SlaterB:
mit scanner.nextLine(); im catch Block funktioniert.

Danke erstmal an alle.

Offenbar wirft scanner.nextInt() nur die InputMismatchException. Ich möchte als nächstes versuchen, eine Prog zu schreiben, bei der verschiedene Exepitons geworfen werden können - InputMismatchException oder ArrayIndexOutOfBoundsException - und die dann unterschiedlich behandeln...

grüße

nossek
 
Zuletzt bearbeitet:

nossek

Aktives Mitglied
Sooo, dieses Prog macht folgendes:

Zuerst soll eine ganze Zahl eingegeben werden.
(Fehlerbehandlung wie gehabt, wenn es keine Zahl ist oder die Zahl den Wertebereich von int überschreitet: eine neue Eingabe ist möglich)

Wenn ersteres geklappt hat: es soll eine Position angeben werden, unter der diese Zahl in einem Array gespeichert werden soll.
Hier werden zwei mögliche Fehler abgefangen:
- Die Eingabe ist keine Zahl bzw. überschreitet den Wertebereich.
- Die Position überschreitet die Araygrenzen.

Wenn ein Fehler bei der Eingabe der Position passiert, muß der Benutzer allerdings ganz von vorne anfangen (also auch die zu speichernde Zahl neu eingeben) - Schicker wäre es, wenn bei einem solchen Fehler nur die Positionseingabe wiederholt werden müsste. Gibt es da einen Kniff oder ist in diesem Design ohnehin der Wurm drin?

Freue mich wie immer über Hinweise und Verbesserungsvorschläge jeder Art...

Java:
import java.util.Scanner;
import java.io.IOException;

public class Main {

    public static void main(String[] args) {

        int[] intArray = new int[10];
        int i;
        int pos;

        Scanner scanner = new Scanner(System.in);

        while(true){
            System.out.print("\nZustand des Arrays: ");
            for(int x : intArray){
                System.out.print(x +" ");
            }
            try{System.out.println("\nBitte geben sie eine Zahl ein. 0 beendet das Programm.");
                i = scanner.nextInt();
                if(i == 0){
                    break;
                }
                
            }
            catch(java.util.InputMismatchException e){
                System.out.println("Ihre Eingabe war keine Zahl. Bitte versuchen Sie es erneut.");
                scanner.nextLine();
                continue;
            }

            try{
                System.out.println("Bitte geben sie die Position ein, unter der die Zahl " +i +" gespeichert werden soll.");
                pos = scanner.nextInt();
                intArray[pos] = i;
            }
            catch(java.util.InputMismatchException e){
                System.out.println("Ihre Eingabe war keine Position. Bitte versuchen Sie es erneut.");
                scanner.nextLine();
            }
            catch(java.lang.ArrayIndexOutOfBoundsException e){
                System.out.println("Die Position die Sie eingegeben haben überschreitet die Grenzen des Arrays. Bitte versuchen Sie es erneut.");
            }
        }

    }
}
 
S

SlaterB

Gast
die doppelte Eingabe verhinderst du offensichtlich, indem du für jede Frage eine eigene while-Schleife verwendest,
damit verhindest du auch das komplizierte continue; im ersten catch-Block

das bringt einem logischerweise dazu, eine eigenständige Methode
> public int readInt(String question, String errormessage)
zu definieren, Aufruf
> int i = readInt(..,..);
> int pos = readInt(..,..);

so fällt der Großteil doppelten Codes weg,
wegen Array musst du aber eher doch noch eine (kleinere) while-Schleife basteln,
ArrayIndexOutOfBoundsException fangen bietet sich da weniger an, wieso vergleichst du nicht auf >0, < Länge des Arrays?

falls solche Bereichsabfragen öfter kommen, kann man wieder an eine Methode
> public int readInt(String question, String errorMessage, int min, int max, String rangeErrorMessage)
denken
 

nossek

Aktives Mitglied
die doppelte Eingabe verhinderst du offensichtlich, indem du für jede Frage eine eigene while-Schleife verwendest,
Dann brauche ich also drei while schleifen, so in der Art?!:
Java:
while(solage das programm läuft){
      while(bis die zahl erfolgreich eingegeben wurde){...}
      while(bis die position erfolgreich eingegeben wurde){...}
      {zahl wird ins array geschrieben}
}

wieso vergleichst du nicht auf >0, < Länge des Arrays?
Ja, weil ich Ausnahmebehandlung üben wollte. Ist es grundsätzlich besser, wenn möglich eine eigene Parameterprüfung einzubauen, damit die Exception garnicht erst auftritt?

Werde jedenfalls versuchen, was Du vorgeschlagen hast, danke!
 
S

SlaterB

Gast
mal Exception, mal besser if-Test, das ist so und so,
InputMismatchException macht Sinn, da wäre es aufwändig, wenn auch nicht unmöglich, vorher isParsableAsInt() auszuführen,
quasi das ganze zweimal zu parsen

es gibt allerdings ein paar grundsätzliche RuntimeExceptions, zu denen ich bisher glaube ich noch kein sinnvolles catch gesehen habe,
NullPointerException, ArrayIndexOutOfBoundsException usw.,
wenn man vermutet dass irgendwas null sein kann oder Grenzen unterboten werden, dann lieber mit if testen

wobei selbst dann die Exception denkbar ist, z.B. wenn ein catch 10 ifs ersetzt
 

nossek

Aktives Mitglied
So, habe versucht Deine Vorschläge umzusetzen, funktionieren tut es anscheinend.

Was ich mich frage:

- Sollte man an readPos(...) statt "maxPos" lieber den Bezeichner des Arrays übergeben?

- ist dieses Konstrukt "while(true)" und dann mit break bzw. return rausspringen wenn alles okay ist denn guter Stil? Es erscheint ja erstmal recht praktisch und klar.

- (vlt. eine blöde Frage): sollte man konsequenterweise noch eine statische methode putIntIntoArray(.....) schreiben?

- Hat sonst jemand irgendwelche Verbesserungsvorschläge?!?


Java:
import java.util.Scanner;
import java.io.IOException;

public class Main {

    public static int readInt(String question, String errorMessage){
        Scanner scanner = new Scanner(System.in);
        while(true){
            try{
                System.out.println(question);
                return scanner.nextInt();
            }
            catch(java.util.InputMismatchException e){
                System.out.println(errorMessage);
                scanner.nextLine();
            }
        }
    }

    public static int readPos(String question, String errorMessage, int maxPos, String rangeErrorMessage){
        int result;
        while(true){
            result = readInt(question, errorMessage);
            if (result <= maxPos & result >= 0){
                return result;
            }
            else{
                System.out.println(rangeErrorMessage);
            }
        }
    }

    public static void printArray(int[] array){
        System.out.print("\nZustand des Arrays: ");
            for(int x : array){
                System.out.print(x +" ");
        }
    }

    public static void main(String[] args) {
        int[] intArray = new int[10];
        int i;
        int pos;

        while(true){
            printArray(intArray);

            i = readInt("\nBitte geben Sie eine Zahl ein. 0 beendet das Programm", "Das war keine Zahl.");

            if(i==0){
                break;
            }

            pos = readPos("Bitte geben sie eine Position ein.", "Das war keine Position.",
                  intArray.length-1, "Die Position ueberschreitet die Arraygrenze.");
            
            intArray[pos] = i;

        }
    }

}
 
Zuletzt bearbeitet:
S

SlaterB

Gast
ob Array oder nicht musst du schon selbst entscheiden, vielleicht nur auf die -1 verzichten und dann < prüfen statt <=,

while-true-break geht schon, vielleicht return statt break

putIntIntoArray halte ich für nicht sinnvoll, kein doppelte Code zu verhindern
 

Der Müde Joe

Top Contributor
Persönlich finde ich das Parsen des Inputs schöner:
Java:
Scanner scanner = new Scanner(System.in);
while(true) {
	String line = scanner.nextLine();
	try {
		Integer i = Integer.decode(line);
		System.out.println("well done: " + i.intValue());
		break; //return i;
	} catch(NumberFormatException e) {
		System.out.println("Not a number...try again");
	}
}
 
S

SlaterB

Gast
ach ja, und gegebenenfalls nur einen Scanner im Programm, z.B. als statische Variable wie System.in auch eine ist,

hat Vor- und Nachteile, nämlich dass etwa bei einer Eingabe "4 5" der zweite Wert noch da ist, was auch Probleme machen kann, oder überlesen wird,
eine Zeile wird immer komplett an einem der Scanner übergeben
 

nossek

Aktives Mitglied
ach ja, und gegebenenfalls nur einen Scanner im Programm, z.B. als statische Variable wie System.in auch eine ist,

hat Vor- und Nachteile, nämlich dass etwa bei einer Eingabe "4 5" der zweite Wert noch da ist, was auch Probleme machen kann, oder überlesen wird,
eine Zeile wird immer komplett an einem der Scanner übergeben

ich habe das erfolgreich vrsucht und glaube zu verstehen!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Wie kann diese Schleife beenden Java Basics - Anfänger-Themen 1
N Was Passiert mit dem Namen einer Variable, wenn man diese einer Liste Hinzufügt Java Basics - Anfänger-Themen 16
M Wie kommen diese Ausgaben zustande? Java Basics - Anfänger-Themen 12
W Warum diese Fehlermeldung? Java Basics - Anfänger-Themen 12
berserkerdq2 Habe eine Klasse, welche public ist, diese hat eine public Methode, die nicht static ist. Wenn ich nun versuche aufzurufen Probleme? Java Basics - Anfänger-Themen 8
Alen123 Wie würdet ihr diese Aufgabenstellung lösen? Java Basics - Anfänger-Themen 18
J Hallo zusammen , was macht diese Methode hier genau? Java Basics - Anfänger-Themen 3
Fats Waller Wofür stehen diese Konstanten im Java Labyrinth ? Java Basics - Anfänger-Themen 5
M Könnte mir jemand diese Aufgabe erklären? Java Basics - Anfänger-Themen 2
M Könnte mir jemand diese Aufgabe erklären? Java Basics - Anfänger-Themen 9
dieter000 Wie schreibe ich diese ZEile um? Java Basics - Anfänger-Themen 1
M Objekt mit eindeutiger ID löschen, das nächste Objekt hat dann diese ID Java Basics - Anfänger-Themen 5
J Womit kann ich diese Methode testen? Java Basics - Anfänger-Themen 5
J Hat jemand einen Lösungsansatz für diese Aufgabe? Java Basics - Anfänger-Themen 1
ZH1896ZH Wieso diese Ausgabe?? Java Basics - Anfänger-Themen 10
T Was macht diese Zeile? Java Basics - Anfänger-Themen 9
G Woher kommt diese Eigenschaft Java Basics - Anfänger-Themen 5
O Was tut diese Methode? und wie müssen die assertions aussehen? Java Basics - Anfänger-Themen 21
F Wie implementiere ich diese Aufgabenstellung? Java Basics - Anfänger-Themen 16
F Wie kann ich diese NullPointerException umgehen?! Java Basics - Anfänger-Themen 41
F Warum erhalte ich diese Fehler bei der Einbindung von SQLite JDBC in Eclipse? Java Basics - Anfänger-Themen 1
F Warum verläuft DIESE Schleife endlos? Java Basics - Anfänger-Themen 4
D Was bedeutet diese Schreibweise? Java Basics - Anfänger-Themen 9
A Erste Schritte Bitte helfen sie mir diese Programm zu schreiben Java Basics - Anfänger-Themen 12
W Wie vermerke ich diese Struktogramm Passage in Java Syntax? Java Basics - Anfänger-Themen 8
N Methoden warum wird diese Methode aufgerufen Java Basics - Anfänger-Themen 9
L Input/Output Wieso kommt diese Ausgabe? Java Basics - Anfänger-Themen 12
L Datentypen Date API - diese Woche bestimmen Java Basics - Anfänger-Themen 1
M Aus Datei auslesen und untersuchen ob diese Zeile schon vorhanden ist Java Basics - Anfänger-Themen 3
B Kann mir jemand diese Bedingung erklären Java Basics - Anfänger-Themen 5
B Wie könnte man mit Java diese Matheaufgabe lösen Java Basics - Anfänger-Themen 7
B Wie würdet ihr diese Methode erklären? Java Basics - Anfänger-Themen 2
C Methoden Welche JSoup Methoden Und Parameter für diese HTML Tags Java Basics - Anfänger-Themen 4
kilopack15 Ist diese setter-Methode richtig? Java Basics - Anfänger-Themen 2
B Wie funktionieren diese Methoden in diesem Sortierverfahren genau? Java Basics - Anfänger-Themen 2
B Was macht diese Methode? Java Basics - Anfänger-Themen 9
P Was macht diese methode Java Basics - Anfänger-Themen 2
P Terminieren diese Schleifen Java Basics - Anfänger-Themen 6
U Ist diese Methode zur Matrix Vektor Multiplikation korrekt ? Java Basics - Anfänger-Themen 5
T Zeilen des ListArray nach einem Wort durchsuchen und diese Zeile ausgeben Java Basics - Anfänger-Themen 4
K Methoden mit den Namen accept. Welche Funktion haben diese? Java Basics - Anfänger-Themen 2
X wie kann ich in bluej/java einene 2d array mit zahlen fuellen, so dass sich diese in der der zeilen Java Basics - Anfänger-Themen 2
G Vertsändnisfrage zu Code - Wie kommt diese Ausgabe zustande? Java Basics - Anfänger-Themen 2
J Kann mir bitte mal jemand diese Codes erklären? Java Basics - Anfänger-Themen 19
D Erste Schritte Dynamisch Objekte erzeugen und diese durchsuchen Java Basics - Anfänger-Themen 7
X Wann schreibt man diese Syntax zeichen { } Java Basics - Anfänger-Themen 8
A Wieso kann ich nicht auf diese Variable zugreifen? Java Basics - Anfänger-Themen 6
A Erste Schritte Wieso funktioniert diese Klasse nicht Java Basics - Anfänger-Themen 11
H Wie erstelle ich diese Klassen? Java Basics - Anfänger-Themen 44
R Kann jemand diese Java Programmierung machen? Versteh ich leider nicht Java Basics - Anfänger-Themen 17
M Erste Schritte Wie kommt man auf diese Ausgabe? Java Basics - Anfänger-Themen 3
S Methoden Return Anweisung beendet Methode nicht, stattdessen wird diese zweimal durchlaufen Java Basics - Anfänger-Themen 3
SexyPenny90 Wieso ist diese eigene Equals-Methode schlecht? Java Basics - Anfänger-Themen 17
F verstehe diese Variable nicht... Java Basics - Anfänger-Themen 4
B for-schleife - Was tut diese? Java Basics - Anfänger-Themen 11
A Wie kommt diese NullPointerException zustande? Java Basics - Anfänger-Themen 13
D Warum ist diese Interfacedeklaration falsch? Java Basics - Anfänger-Themen 5
T Warum brauche ich diese IOException? Java Basics - Anfänger-Themen 30
R Welche Datenstruktor für diese Liste? Java Basics - Anfänger-Themen 6
B Erste Schritte Welche Kenntnisse brauche ich für diese Programmidee? Java Basics - Anfänger-Themen 4
L Immer diese Arrays Java Basics - Anfänger-Themen 11
H Was macht diese Methode? Java Basics - Anfänger-Themen 3
A was berechnet diese programm? Java Basics - Anfänger-Themen 13
G Was bedeutet diese Zeile? Java Basics - Anfänger-Themen 2
J Warum muss diese Methode static sein ?! Java Basics - Anfänger-Themen 7
H Warum funktioniert diese kleine Methode nicht? Java Basics - Anfänger-Themen 8
P ich versteh diese Methode nicht ;? Java Basics - Anfänger-Themen 7
P Datentypen Warum findet er diese methoden nicht? Java Basics - Anfänger-Themen 13
O Ist diese Zahl größer oder kleiner 0? Java Basics - Anfänger-Themen 6
M Ist diese Aufgabe zu umständlich gelöst? Java Basics - Anfänger-Themen 9
M Gibt es eine einfachere Variante diese Aufgabenstellung zu lösen? Java Basics - Anfänger-Themen 11
hdi Brainlag: Warum fliegt diese NPE? Java Basics - Anfänger-Themen 10
J Woher kommt diese NullPointerException? Java Basics - Anfänger-Themen 6
N Verstehe diese Aufgabe nicht! Java Basics - Anfänger-Themen 16
D Wie wird diese Verzweigung genannt? Java Basics - Anfänger-Themen 6
H Klassen zur Anzeige ines Bildes und zum Zeichnen innerhalb diese Bildes Java Basics - Anfänger-Themen 2
N Wer kann diese Zeile erklären? Java Basics - Anfänger-Themen 9
T Warum muss diese Variable final deklariert werden? Java Basics - Anfänger-Themen 5
W Bindung bzw warum wird diese Methode aufgerufen? Java Basics - Anfänger-Themen 5
P [Positiv Erledigt] Ordner mit Bildern auslesen und diese speichern Java Basics - Anfänger-Themen 7
I Was macht diese Funktion? Java Basics - Anfänger-Themen 4
K Warum funktioniert diese Methode nicht? Java Basics - Anfänger-Themen 20
S Ich verstehe diese Methode nicht! Java Basics - Anfänger-Themen 6
G while (true) ? wodurch wird diese Schleife beendet? Java Basics - Anfänger-Themen 6
G Threads prüfen, ob diese noch laufen. Java Basics - Anfänger-Themen 3
G Class Getopts <-- Wie kann ich diese Class importieren Java Basics - Anfänger-Themen 1
G was bedeuted diese sachen wie <E> und so? Java Basics - Anfänger-Themen 2
S Warum bekomme ich diese Exception ? Java Basics - Anfänger-Themen 3
C Wie kann ich diese Methode aufrufen? Java Basics - Anfänger-Themen 2
M Warum wird diese Methode ausgeführt? Java Basics - Anfänger-Themen 2
M wie kann man diese Funktion besser machen ? Java Basics - Anfänger-Themen 3
S Nach Namen sortieren und diese in 3 Gruppen aufteilen Java Basics - Anfänger-Themen 16
ven000m Primzahl.class wie starte ich diese einzelne Datei? Java Basics - Anfänger-Themen 10
B wo finde ich diese Dateien? Java Basics - Anfänger-Themen 6
R Was bedeutet diese Zeile. Java Basics - Anfänger-Themen 8
S Rahmen zeichnen, wie heisst diese Componente Java Basics - Anfänger-Themen 6
A Was erzeugen diese Eingaben? Java Basics - Anfänger-Themen 2
M bewirken diese Schreibweisen das gleiche? :) Java Basics - Anfänger-Themen 8
G Was bedeutet diese Fehlermeldung von Tomcat Java Basics - Anfänger-Themen 29
M warum wird diese while schleife nicht unterbrochen Java Basics - Anfänger-Themen 12

Ähnliche Java Themen

Neue Themen


Oben