# nur ein Zeichen einlesen (Konsole)



## DON L (14. Dez 2003)

Hi.

Ich habe schon in diesem Forum rumgestöbert und ein paar Beiträge zu diesem Thema gefunden, die mir leider nicht weitergeholfen haben. Also stelle ich die Frage ein weiteres mal.

Fragestellung:
Wie kann ich in der Konsole eine Abfrage von nur einem Zeichen machen? D.h. du wirst zu einer Eingabe aufgefordert, z.B. "System.out.print ("Drücke X oder Y");", und nach der Eingabe (ohne Enter zu drücken) soll der Wert in eine Variabele gespeichert werden.

In anderen Beiträgen habe Vorschläge wie, _...Versuche es mit read() oder mit StreamInput..._, gelesen, doch damit konnte ich leider nichts anfangen, Anfänger halt. Ich würde mich über jede präzisere Beschreibung sehr freuen.


----------



## Stefan1200 (15. Dez 2003)

Kein Problem:

Ganz zu Anfang:

```
import java.io.*;
```

In deiner Klasse:

```
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
```

Die obigen Zeilen brauchst du auf jeden Fall.
Nun möchte ich beides erwähnen:

Nur ein Zeichen einlesen (deine Fragestellung):

```
char eingabe = ' ';
eingabe = br.read();
```

Eine Zeile bis zum Enter einlesen:

```
String eingabe = "";
eingabe = br.readLine();
```

Denke bitte daran den IOException bei der read() oder readLine() Methode abzufangen.
Entweder durch try...catch oder throws.


----------



## DON L (16. Dez 2003)

Erstmal danke für die Antwort.

Den Code habe ich so übernohmen, d.h. in der StdIn.java habe ich die Methode "OneCharInput" eingefügt. 
Sieht nun so aus (StdIn.java):

```
public static char OneCharInput ()
    {
       try
        {
         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
         char eingabe = ' ';
         eingabe = br.read();
        }
        catch (IOException e){return null;};
        return eingabe;
    }
```
Ist doch so weit korrekt?!

Diese Methode wird wie folgt aufgerufen:

```
import StdIn;
...
char x;
x = StdIn.OneCharInput();
```

Alle anderen Methoden kann ich aus der Oberklasse aufrufen und beim Aufruf dieser Methode bekomme ich beim Kompelieren mit dem JavaEditor diese Fehlermldung:



> .\StdIn.java:61: possible loss of precision
> found     : int
> required : char
> ________eingabe = br.read();
> ______________________^


Der Bodenstrich sollte ein Leerzeichen darstellen... :?

Den Fehler verstehe ich nicht wirklich, da er ein Int findet!?!


----------



## Stefan1200 (16. Dez 2003)

Habe mal schnell in der API nachgelesen, und du hast recht.
Auf folgender Seite
http://java.sun.com/j2se/1.4.2/docs/api/java/io/BufferedReader.html#read()
steht, das man ein int bekommt, der aber den Wert des chars enthält. Soll also heissen, du musst den Integer noch in einen char casten. Ändere doch bitte die Zeile


```
eingabe = br.read();
```

um in folgende Zeile:


```
eingabe = (char)br.read();
```

Das sollte klappen.


----------



## DON L (17. Dez 2003)

Hallo Stefan1200,

wie es aussieht bist du der Einzige im Forum, der zu Helfen vermag.

Dein Vorschlage habe ich so übernohmen, doch die Fehlermeldungen ließen aus sich nicht lange warten. Beim Kompelieren sagte mir der JavaEditor folgendes:


> StdIn.java: 63: incompatible types
> found : <null>
> required: char
> _______catch (IOException e {retrun null;};
> _______________________________^


Darauf hin habe ich aus dem Wort "NULL" zwei Hochkommas gemacht, die durch ein Leerzeichen getrennt sind. Am besten Bilde ich mal an dieser Stelle den Quellcode ab:

```
public static char OneCharInput ()
    {
       char eingabe = ' ';
       try
        {
         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
         eingabe = (char)br.read();
        }
        catch (IOException e){return ' ';};
        return eingabe;
    }
}
```
Mit diesem Code lässt sich das Programm nun kompilieren. Doch beim Aufruf der Methode kann ich immernoch mehrer Zeichen eingeben, die ich mit Enter bestätigen muss. Schön ist, dass nur das erste Zeichen zurückgegeben wird.

Wegen meine geringen Erfahrung mit Java, die etwa gegen Null tendiert, weiß ich nicht wo ich den Fehler suchen soll, Quelltext, Kompiler, Programmierer...
Mich beschleicht langsam ein Gefühl, dass  JAVA mir weiterhin ein Buch mit sieben Siegeln bleiben wird.  :cry: 

Danke für die Hilfe im Voraus.


----------



## Stefan1200 (18. Dez 2003)

Wie wird die Methode OneCharInput aufgerufen?
Poste mal etwas mehr code.

return ' '
ist nicht sehr sinnvoll. Denn man kann ja auch die Leertaste drücken ;-)


----------



## bygones (18. Dez 2003)

ich würde in der Methode nicht die exception abfangen sondern über throws an die Methode weiterleiten, die diese Methode aufruft....

Dann umgehst du das Problem eines Rückgabe wertes und die oberfunktion bekäme nicht mit, dass ein Fehler aufgetreten ist !


----------



## Ebenius (19. Dez 2003)

@Stefan1200: Dein Code-Beispiel liest zwar nur das erste Zeichen ein, trotzdem musst Du erst ENTER drücken, bevor das Lesen vom Standard-In abgeschlossen wird.

Es grüßt Ebenius


----------

