Java: Methode Terminal.askInt funktioniert nicht?
Hallo, ich wollte mal fragen, warum die Methode Terminal.askInt im Programm nicht ausgeführt wird und wie ich das vielleicht ändern kann.
Aufgabenstellung:
Vervollständigen Sie die Methode "countdown" mit einer while-Schleife.
Die Methode soll vom übergebenen Wert "c" runterzählen und dabei Zeilenweise den aktuellen Wert ausgeben.
Wenn die 0 erreicht wird, wird "Start!" ausgegeben.
Vervollständigen Sie die Methode "main" mit einer for-Schleife.
Der Nutzer soll immer wieder nach einem Wert gefragt werden, bis eine Zahl kleiner oder gleich 0 eingegeben wird.
Nach jeder Eingabe wird ein Countdown mit dem eingegebenen Wert gestartet.
*Im Programm muss an stelle bei Zeile 18: System.out.askInt ''Terminal.ask.Int'' hin, aber beides funktioniert nicht...
3 Antworten
Die Frage an der Stelle wäre: Woher kommt askInt? Es handelt sich um keine PrintStream-Methode aus der Java SE.
Eingaben aus der Konsole kannst du mit einem Scanner-Objekt lesen. Insgesamt brauchst du für dein Programm nur ein Scanner-Objekt.
Beispiel:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
int number = reader.nextInt();
reader.close();
}
}
Welche Version?
Das Beispiel zeigt, wie man ein Scanner-Objekt erstellen kann, welches fortan den Standardeingabekanal der Konsole (System.in) beobachtet. Zum Lesen von eingegebenen Werten hat das Objekt Methoden wie nextInt, next, nextLine, etc. zur Verfügung (siehe hier). Wenn du keine Eingaben mehr Lesen möchtest (typischerweise am Programmende), kannst du die Verbindungen des Scanners schließen.
Die Methode askInt gibts nicht, das musst du mit einem Scanner machen.
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/PrintStream.html
Die Klasse PrintStream definiert keine Methode askInt.
Das musst du also selber machen z.B. durch benutzung von Scanner.
Um lediglich "Countdown:" auszugeben benutze
System.out.println("Countdown");
import java.util.Scanner;
public class Loops {
public static void main(String[] args) {
for(int c = getCount(); c > 0; c = getCount()) {
countdown(c);
}
}
public static void countdown(int c) {
while(c > 0) {
System.out.println(c);
c--;
}
System.out.println("Start!");
}
public static int getCount() {
Scanner reader = new Scanner(System.in);
System.out.println("Countdown:\n");
reader.close();
return 0;
}
}
Trotz scanner kann ich in das Eingabefeld nichts schreiben, weisst du woran das liegt?
- Du liest nirgendwo mit dem Scanner aktiv Werte aus. Du musst die next-Methoden des Objekts nutzen (lies hier).
- Rufe die close-Methode nur auf, wenn du absolut keine Eingaben mehr von der Konsole lesen möchtest. Die close-Methode schließt die Verbindungen des Scanners, also auch den Eingabekanal (System.in), der somit danach nicht mehr erreichbar ist.
- Insgesamt brauchst du nur ein einziges Scanner-Objekt. Du hingegen erstellst bei jedem Aufruf von getCount ein neues. Entweder du deklarierst die Variable für den Scanner für den globalen Raum oder du erstellst das Objekt in main und reichst es dann via Parameter immer weiter.
Variante 1:
class Main {
static Scanner reader = new Scanner(System.in);
/* ... */
public static int getCount() {
System.out.println("Countdown:\n");
return reader.nextInt();
}
}
Variante 2:
class Main {
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
for (int c = getCount(reader); c > 0; c = getCount(reader)) {
// ...
}
reader.close();
}
/* ... */
public static int getCount(Scanner reader) {
System.out.println("Countdown:\n");
return reader.nextInt();
}
}
Also verstehe ich richtig, dass ich die Version ändern muss, damit es das lesen kann?