Wie kann ich bei int-Variablen im exception handler auf bestimmte Strings reagieren?

Hallo zusammen

Ich habe ein try-Block, in dem der User per Scanner eine Int-Variable eingibt. Dazu habe ich einen catch-Block, um InputMismatchException abzufangen (alles, was nicht int ist). So weit, so gut.

Nun will ich aber bei bestimmten, eigentlich falschen, User-Eingaben, eine If-Schleife einbauen. Konkret; falls der User "quit" eingibt, soll abgebrochen werden.
Dazu 2 Fragen:
  1. Ist es sinnvoller, diese IF-Schleife direkt nach der User-Eingabe einzubauen oder besser erst im catch-Block?
  2. Ich habe eine funktionierende Lösung: Anstatt int-Variablen werden String-Variablen abgefragt. Die werden anschliessend in Ints umgewandelt. Das ist mir zu unelegant. Gibt es bessere Lösungen, mit denen ich int-Variablen behalten und trotzdem zusätzlich "quit" abfangen kann?
Der in der Aufgabenstellung enthaltene Anfangscode sowie die Aufgabenstellung selbst sind in meinem Code enthalten, zuunterst.
Danke für eure Tipps.
Gruss aus dem regnerischen Bern,
Markus

Java:
import java.util.*;

public class kapitel80a1 {
    public static void main(String[] args) {
        Scanner scan = new Scanner( System.in  );
        String num="", div="" ;
        int numInt=0, divInt=0;
        boolean allesOk=false;

        while (allesOk==false){
            try{
                System.out.print("Enter the numerator: ");
                num = scan.next();
                if (num.charAt(0)=='q'||num.charAt(1)=='Q'){
                    System.out.println("na dann tschuess");
                    System.exit(0);
                }
                numInt=Integer.parseInt (num);
                System.out.print("Enter the divisor  : ");
                div = scan.next();
                divInt=Integer.parseInt(div);
                System.out.println( numInt + " / " + divInt + " is " + (numInt/divInt) + " rem " + (numInt%divInt) );
                allesOk=true;
            } catch (ArithmeticException ex ){
                System.out.println("You can't divide " + num + " by " + div);
            } catch (InputMismatchException ie) {
                System.out.println("Hoppla, da ist wohl ein Buchstabe oder so reingerutscht.");
                System.out.println("Probiers nomau");
            } catch (NumberFormatException ne){
                System.out.println("Hoppla, da ist wohl ein Buchstabe oder so reingerutscht.");
                System.out.println("Probiers nomau");
            } catch (StringIndexOutOfBoundsException se){
                System.out.println("check mal deine Eingabe fuer den teiler");
            } finally {
                System.out.println("If something went wrong, you entered bad data." );
            }
            System.out.println("------------------------------------------------------");

        }
        System.out.println("I han fertig!");
        
    }

/*
//Original-Code:
import java.util.* ;

public class SquareUser
{

  public static void main ( String[] a )
  {
    Scanner scan = new Scanner( System.in  );
    int num = 0 ;
    boolean goodData = false;

    while ( !goodData )
    {
      System.out.print("Enter an integer: ");
      
      try
      {
        num = scan.nextInt();     
        goodData = true;
      }

      catch (InputMismatchException  ex )
      {
        System.out.println("You entered bad data." );
        System.out.println("Please try again.\n" );
        String flush = scan.next();
      }
    }

    System.out.println("The square of " + num + " is " + num*num );
}




Enhance the DivisionPractice program from the chapter:

Put in a loop so that the user is repeatedly asked for the numerator and the divisor.
For each set of data, the program prints out the result,
or an informative error message if there is a problem (division by zero or poor input data).
The program continues looping, even if there is a problem

Exit the loop when data entered for the numerator start with characters "q" or "Q".
Don't print out an error message in this case.
Don't ask for the divisor if the user just asked to quit.


Here is sample output from one run:
Enter the numerator: 12
Enter the divisor:  4
12 / 4 is 3

Enter the numerator: 12
Enter the divisor  : 0
You can't divide 12 by 0

Enter the numerator: glarch
You entered bad data.
Please try again.

Enter the numerator: quit
You will need to use the method charAt() from the String class.

Click here to go back to the main menu.
*/
}
 
K

kneitzel

Gast
Also erst einmal: "IF Schleife" - If ist natürlich keine Schleife! Es gibt lediglich eine if Bedingung und dann eine bedingte Ausführung eines Befehls oder Blocks.

Dann: Exception sind immer etwas, das eine unerwartete Sache ist. Die Festplatte ist kaputt, das Netzwerk geht plötzlich nicht mehr oder irgend was, was unerwartet ist. Eine Usereingabe fällt da nicht drunter. Erst recht nicht, wenn es eine gültige, erwünschte Eingabe ist. Daher ja: Eingabe ordentlich abfragen als String und dann entsprechend die Eingabe prüfen.

Und eleganter bekommst Du es über einen Objektorientierten Ansatz. Statt mit Basistypen kannst Du die Eingabe natürlich auch modellieren. Das kann - je nach Anforderung - etwas triviales sein oder eben etwas mit vielen Klassen...

Also man könnte eine Klasse Eingabe bauen, die dann eine Eingabe entgegen nimmt und zentral auswertet. Dann hättest Du im Code sowas wie:
Java:
Eingabe eingabe = new Eingabe(); // oder = Eingabe.next() oder so - da wäre z.B. ein Iterator Pattern denkbar - also mit hasNext und next Eingaben abarbeiten ...
switch(eingabe.getInputType()) {
    case QUIT_COMMAND: // quit ausführen.
        break;
    case INVALID_INPUT: // was auch immer du da machen möchtest ...
        break;
    case NUMBER:
        int number = eingabe.getNumber(); // Die Zahl wäre dann natürlich so abfragbar ...
        // weitere Nutzung der Zahl ...
        break;
    default:
        // Was auch immer ... z.B. ein throw new RuntimeException("New InputType defined without changing the use in the code!");
}

Die Frage ist immer, was man genau benötigt. Und bei ungültigen Eingaben erneut eine Eingabe abzufragen, wäre dann auch an einer zentralen Stelle.
 
Also erst einmal: "IF Schleife" - If ist natürlich keine Schleife! Es gibt lediglich eine if Bedingung und dann eine bedingte Ausführung eines Befehls oder Blocks.

Dann: Exception sind immer etwas, das eine unerwartete Sache ist. Die Festplatte ist kaputt, das Netzwerk geht plötzlich nicht mehr oder irgend was, was unerwartet ist. Eine Usereingabe fällt da nicht drunter. Erst recht nicht, wenn es eine gültige, erwünschte Eingabe ist. Daher ja: Eingabe ordentlich abfragen als String und dann entsprechend die Eingabe prüfen.

Und eleganter bekommst Du es über einen Objektorientierten Ansatz. Statt mit Basistypen kannst Du die Eingabe natürlich auch modellieren. Das kann - je nach Anforderung - etwas triviales sein oder eben etwas mit vielen Klassen...

Also man könnte eine Klasse Eingabe bauen, die dann eine Eingabe entgegen nimmt und zentral auswertet. Dann hättest Du im Code sowas wie:
Java:
Eingabe eingabe = new Eingabe(); // oder = Eingabe.next() oder so - da wäre z.B. ein Iterator Pattern denkbar - also mit hasNext und next Eingaben abarbeiten ...
switch(eingabe.getInputType()) {
    case QUIT_COMMAND: // quit ausführen.
        break;
    case INVALID_INPUT: // was auch immer du da machen möchtest ...
        break;
    case NUMBER:
        int number = eingabe.getNumber(); // Die Zahl wäre dann natürlich so abfragbar ...
        // weitere Nutzung der Zahl ...
        break;
    default:
        // Was auch immer ... z.B. ein throw new RuntimeException("New InputType defined without changing the use in the code!");
}

Die Frage ist immer, was man genau benötigt. Und bei ungültigen Eingaben erneut eine Eingabe abzufragen, wäre dann auch an einer zentralen Stelle.
okay, danke schon mal für die Klarstellungen.
Den Rest muss ich noch testen ;-)
 
K

kneitzel

Gast
Also in der Regel sollte eine Eingabe überprüft werden. Da kann man gerne streiten, in wie weit bei Zahlen einfach eine Konvertierung versucht wird um dann die Exception zu fangen. Aber bei Applikationen wird oft mehr Komfort gegeben, d.h. in einem Eingabefeld für eine Zahl kann auch nur eine Zahl eingegeben werden ... Das Java Framework bietet bei dem Konvertieren nur den direkten Versuch. Das ist bei anderen Umgebungen teilweise anders - das .Net Framework hat da z.B. auch ein tryParse.

Aber bei der Reihenfolge wäre auf jeden Fall immer etwas wie:
- Erst alle Nicht-Zahlen abprüfen (Also ist es ein Quit Befehl?)
- Dann, wenn es nur noch eine Zahl sein kann, das parsen probieren.
Das kann durchaus akzeptabel sein. Aber ich würde immer erst eine Validierung z.B. mit Regulären Ausdrücken machen oder so ...
 

Panda9296

Bekanntes Mitglied
okay naja ich bin vom möglichen ausgegangen und wollte das an dieser Stelle, auch für mich zum Verständnis korrigieren. Ich bin bei dem Beispiel oben von einer Konsolenapplikation ausgegangen. Trotzdem möglich ist es.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Welcher Object-Lock-Pool bei static Variablen? Java Basics - Anfänger-Themen 3
T variablen klassen übergreifend Java Basics - Anfänger-Themen 12
T Variablen Java Basics - Anfänger-Themen 1
N Verständnis Frage zu Variablen Java Basics - Anfänger-Themen 3
M Aufsummieren von variablen Wertegrößen Java Basics - Anfänger-Themen 17
M Mehrere Daten/ Variablen Speichern Java Basics - Anfänger-Themen 9
J Speichern von zwei Variablen durch Auslesen aus einem Numberfield Java Basics - Anfänger-Themen 2
ashi Variablen aufrufen Java Basics - Anfänger-Themen 17
U Warum kann ich, auf private Variablen zugreifen, wenn ich ein Objekt in der Klasse, die private Variablen hat erstelle und dort drauf zugreifen will? Java Basics - Anfänger-Themen 7
B Konkatenieren eines Strings und inkremtierenden Zahl zu einer INT Variablen Java Basics - Anfänger-Themen 7
A 2 Strings vergleichen in einer methode wenn man mit Globalen variablen arbeitet Java Basics - Anfänger-Themen 12
C Konstruktoren und Variablen Java Basics - Anfänger-Themen 42
F Auf Variablen eines Konstruktors zugreifen Java Basics - Anfänger-Themen 4
N Variable aus anderen Variablen in statischer Klasse berechnen/abspeichern? Java Basics - Anfänger-Themen 4
M Warum dürfen Objekte einer Klasse auf statische Variablen dieser Klasse referenzieren? Java Basics - Anfänger-Themen 10
B Variablen Variablen übertragen ohne Klassen Java Basics - Anfänger-Themen 5
B Methoden Methoden haben kein Zugriff auf variablen Java Basics - Anfänger-Themen 4
T Java Swing - Dreieck zeichnen mit verschiedenen Variablen Java Basics - Anfänger-Themen 8
Arif Vererbung Methodenvererbung mit finalen Variablen Java Basics - Anfänger-Themen 1
M Wie kann ich ein Objekt erstellen, wenn sich der Klassenname in einer Variablen befindet? Java Basics - Anfänger-Themen 10
S Variablen Variablen in einer Schleife erstellen lassen Java Basics - Anfänger-Themen 11
J Ich brauche Hilfe bei einem Code (Variablen speichern) Java Basics - Anfänger-Themen 29
F Variablen Werte einer Klasse überschreiben Java Basics - Anfänger-Themen 4
N Speichern von Werten in Variablen nach Schließen des Programms Java Basics - Anfänger-Themen 3
J Frage dazu Variablen klassenübergreifend zu verändern Java Basics - Anfänger-Themen 22
M Java Instanz-Variablen ? Java Basics - Anfänger-Themen 3
B Variablen von Methoden übertragen Java Basics - Anfänger-Themen 2
M Variablen umbenennen Java Basics - Anfänger-Themen 1
T Körper Brechnung - Lokale Variablen in Methoden übergeben Java Basics - Anfänger-Themen 10
P Zugriff auf Variablen anderer Klassen in Greenfoot Java Basics - Anfänger-Themen 1
mars90 Fehler in der Variablen Deklaration Java Basics - Anfänger-Themen 8
E Variablen in formatierter Ausgabe Java Basics - Anfänger-Themen 15
V Schleife für das Einlesen von Werten für int Variablen, die Bestandteil von Arrays sein sollen Java Basics - Anfänger-Themen 16
M Komisches Verhalten der Variablen Java Basics - Anfänger-Themen 6
H Variablen Multiplikation einer inkrementierten Variablen Java Basics - Anfänger-Themen 5
scratchy1 Variablen vertauschen wenn Bedingung "umgedreht" wird Java Basics - Anfänger-Themen 40
J Variablen mit einer anderen Klasse bekannt machen Java Basics - Anfänger-Themen 7
C Methoden Problem beim Speichern von Variablen Java Basics - Anfänger-Themen 1
A Übergreifende Variablen Java Basics - Anfänger-Themen 17
A Variablen Verständnisfrage bzgl. Variablen/Referenzen Java Basics - Anfänger-Themen 3
H Variablen Methode zum Abfragen von Variablen aus Subklassen Java Basics - Anfänger-Themen 9
P Variablen Variablen voneinander abhängig Java Basics - Anfänger-Themen 54
F Liste nach einer Variablen sortieren Java Basics - Anfänger-Themen 6
L Variablen in anderen Klassen nutzen Java Basics - Anfänger-Themen 6
M For-Schleife durch zwei versch. Variablen begrenzen Java Basics - Anfänger-Themen 27
J Klassen Variablen in andere Klassen oder Methoden übernehmen Java Basics - Anfänger-Themen 1
P Liste auslesen und in Variablen speichern Java Basics - Anfänger-Themen 7
temi Redundante Variablen Java Basics - Anfänger-Themen 29
Aprendiendo Zweifel mit versteckter Variablen Java Basics - Anfänger-Themen 16
L Variablen einmal nur zu weisen Java Basics - Anfänger-Themen 62
D Statische Variablen/Methoden Java Basics - Anfänger-Themen 3
R Abfrage von Variablen in Unterklassen einer ArrayList Java Basics - Anfänger-Themen 9
M Listener für Button - Wert von Variablen verändern Java Basics - Anfänger-Themen 14
S Vererbung Variablen klassenübergreifend nutzen Java Basics - Anfänger-Themen 42
R Auf Variablen einer anderen Klasse zugreifen? Java Basics - Anfänger-Themen 1
D Fehlermeldung obwohl Variablen bereits deklariert sind? Java Basics - Anfänger-Themen 14
E 2 Probleme - Datum & private finale Variablen Java Basics - Anfänger-Themen 5
Aruetiise Variablen JFrame und Variablen Java Basics - Anfänger-Themen 3
L Variablen dekleration + reset Java Basics - Anfänger-Themen 16
T Übernahme einer Variablen im ActionListener/ActionEvent Java Basics - Anfänger-Themen 2
D Kapselung final Variablen mit Getter? Java Basics - Anfänger-Themen 2
C Variablen von einem JFrame in einen anderen übertragen Java Basics - Anfänger-Themen 3
P Interface Variablen-Inhalte werden nicht übergeben Java Basics - Anfänger-Themen 3
C Variablen in Schleifen außerhalb verwenden Java Basics - Anfänger-Themen 2
S Variablen Flexible Variablen Namen Java Basics - Anfänger-Themen 3
R Erste Schritte 3 Variablen hochzählen lassen Java Basics - Anfänger-Themen 1
RowdyN Variablen Variablen beliebig benennen? Java Basics - Anfänger-Themen 6
S OOP Variablen zwischen mehreren Klassen Java Basics - Anfänger-Themen 11
T Koordinatensystem zeichnen - Variablen merken? Quadratische Funktion zeichnen? Java Basics - Anfänger-Themen 5
H Variablen einer Schleife zwischenspeichern Java Basics - Anfänger-Themen 2
P Klassen Variablen von einer Klasse zur anderen Java Basics - Anfänger-Themen 5
H Objekt überschreibt Variablen vorheriger Objekte Java Basics - Anfänger-Themen 2
P Variablen in Excel speichern Java Basics - Anfänger-Themen 6
S PHP Aufruf mit mehreren Variablen Java Basics - Anfänger-Themen 2
F Variablen unterschiedlicher Datentypen Java Basics - Anfänger-Themen 6
S ActionListener und Statische Variablen Java Basics - Anfänger-Themen 4
Arif Vererbung Vererbung Variablen überschreiben Java Basics - Anfänger-Themen 1
L Vergleich zweier Variablen, mit Abweichung Java Basics - Anfänger-Themen 3
P Variablen einer Methode in andere Method übergeben Java Basics - Anfänger-Themen 6
G Variablen Verwendung von Variablen in anderer Klasse Java Basics - Anfänger-Themen 6
P Textfelder in Variablen speichern Java Basics - Anfänger-Themen 13
K arraygröße durch variablen Konstruktor? Java Basics - Anfänger-Themen 7
J Vererbung Variablen aus Superklasse übernehmen Java Basics - Anfänger-Themen 2
L Variablen aus TXT Datei auslesen und vergleichen. Java Basics - Anfänger-Themen 5
K Welchen Typ haben Variablen in Default-Methoden und in statischen Methoden in Schnittstellen? Java Basics - Anfänger-Themen 4
K Wieso muss man finale statische Variablen sofort oder eben im Konstruktor initialisieren? Java Basics - Anfänger-Themen 2
L zwei Variablen gleichzeitig übergeben Java Basics - Anfänger-Themen 6
J Vererbung privater Variablen Java Basics - Anfänger-Themen 7
D Klassen Verhalten von Klassenvererbung bei Variablen Java Basics - Anfänger-Themen 1
G Alle Objekte und Variablen automatisch ausgeben Java Basics - Anfänger-Themen 7
S OOP Werte von Vektoren mit 3 Variablen ausgeben lassen Java Basics - Anfänger-Themen 3
A Variablen aus einer Schleife gezielt auslesen Java Basics - Anfänger-Themen 11
A Methoden Zugriff auf eingelesene Variablen in der main Methode (ohne Änderung der Parameterliste) Java Basics - Anfänger-Themen 4
K Enigma, variablen übernehmen Java Basics - Anfänger-Themen 6
F Erste Schritte Dynamische Variablen Java Basics - Anfänger-Themen 15
N Variablen zurück casten Java Basics - Anfänger-Themen 3
M Repräsentation von variablen/OOP Java Basics - Anfänger-Themen 2
B Probleme beim einlesen einer short variablen für einen Array Java Basics - Anfänger-Themen 1
S Warum erlaubt ein while-Loop keine Variablen-Declaration wie der for-Loop..? Java Basics - Anfänger-Themen 6
S Variablen Variable erzeugen und Array mit Variablen befüllen Java Basics - Anfänger-Themen 26

Ähnliche Java Themen

Neue Themen


Oben