Scanner-Error

Diskutiere Scanner-Error im Java Basics - Anfänger-Themen Bereich.
A

ava_corp

Hallo,

ich habe im folgendem Code laut debugger

Code:
Exception in thread "main" java.util.NoSuchElementException
    at java.base/java.util.Scanner.throwFor(Scanner.java:937)
    at java.base/java.util.Scanner.next(Scanner.java:1594)
    at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
    at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
Ich suche und suche, aber ich finde den Fehler einfach nicht.
Hier der Code

Java:
import java.util.Scanner;


public class rechenuebungen
{

    public static void main(String[] args)
    {
        
        
        int ber[] = gener();
        if(ber[0] == ber[1])
            System.out.println("Super, das war richtig!");
        else
            System.out.printf("Das war leider nicht richtig. Lösung: %d", ber[0]);
        
    }
    public static int io()
    {
        Scanner scan = new Scanner(System.in);
        System.out.println("Bitte wählen Sie eine Option: ");
        System.out.println("1. Addieren\n2. Subtrahieren\n3. Multiplizieren\n4. Dividieren\n");
        int auswahl = scan.nextInt();
        scan.close();
        
        return auswahl;
    }
    public static int[] gener()
    {
        int aw = io();
        Scanner scan = new Scanner(System.in);
        
        
        int a = (int) (1 + Math.random() *100);
        int b = (int) (1 + Math.random() *100);
        int c[] = new int[2];
        switch(aw)
        {
        case 1: c[0] = a + b; System.out.printf("Bitte berechne %d + %d", a, b);
                                        c[1] = scan.nextInt();break;
        case 2: c[0] = a - b; System.out.printf("Bitte berechne %d - %d", a, b);
                                        c[1] = scan.nextInt();break;
        case 3: c[0] = a * b; System.out.printf("Bitte berechne %d * %d", a, b);
                                        c[1] = scan.nextInt();break;
        case 4: c[0] = a / b; System.out.printf("Bitte berechne %d / %d", a, b);
                                        c[1] = scan.nextInt();break;
        }
        scan.close();
        
        return c;
    }
 
J

JustNobody

Also das erste das direkt auffällt: Du schliesst den Scanner und damit System.in. Das ist etwas, das Du bestimmt nicht willst.
Meine Empfehlung: mach die Scanner Instanzvariable zu einer public static Klassenvariable, die Du dann benutzt (und natürlich nicht schliesst).
 
A

ava_corp

Also das erste das direkt auffällt: Du schliesst den Scanner und damit System.in. Das ist etwas, das Du bestimmt nicht willst.
Meine Empfehlung: mach die Scanner Instanzvariable zu einer public static Klassenvariable, die Du dann benutzt (und natürlich nicht schliesst).
Danke für den Tipp.
Also ich habe jetzt(siehe code) geschrieben. Das funktioniert, aber ist das so der beste Weg?

Java:
public static int scin()
    {
        Scanner scan = new Scanner(System.in);
        int scio = scan.nextInt();
        
        return scio;
    }
 
MoxxiManagarm

MoxxiManagarm

Das ist noch keine Instanyvariable. Gemeint ist das:

Java:
public class rechenuebungen
{
  private static Scanner scan = new Scanner(System.in);

  // deine Methoden
}
Du solltest dir übrigens auch überlegen die ganzen static Methoden nicht static zu machen und ein neues Objekt für jede Rechnung statdessen zu erzeugen. Außerdem halte dich bitte an Java Namenskonventionen, das beinhaltet auch Klassen immer mit einem Großbuchstaben zu beginnen.
 
A

ava_corp

Das ist noch keine Instanyvariable. Gemeint ist das:

Java:
public class rechenuebungen
{
  private static Scanner scan = new Scanner(System.in);

  // deine Methoden
}
Du solltest dir übrigens auch überlegen die ganzen static Methoden nicht static zu machen und ein neues Objekt für jede Rechnung statdessen zu erzeugen. Außerdem halte dich bitte an Java Namenskonventionen, das beinhaltet auch Klassen immer mit einem Großbuchstaben zu beginnen.

Okay, jetzt habe ich verstanden.
Danke für die schnelle Antwort und den Tipps.
 
M

M.L.

Noch ein Tip: das Programm läuft nur einmal durch. Besser wäre eine "do...while"-Schleife, die das Programm z.B. erst bei Eingabe von "q" beendet. Und bei der Divisionsrechnung werden bei der Eingabe nur ganze Zahlen zugelassen, was u.a. zu folgendem Fehler führen kann: (Addendum: 0 als Ergebnis wird akzeptiert, ist aber wohl nicht das erwartete Ergebnis)Eclipse_Division.JPG
 
Zuletzt bearbeitet:
A

ava_corp

Noch ein Tip: das Programm läuft nur einmal durch. Besser wäre eine "do...while"-Schleife, die das Programm z.B. erst bei Eingabe von "q" beendet. Und bei der Divisionsrechnung werden bei der Eingabe nur ganze Zahlen zugelassen, was u.a. zu folgendem Fehler führen kann: (Addendum: 0 als Ergebnis wird akzeptiert, ist aber wohl nicht das erwartete Ergebnis)Anhang anzeigen 13198
Danke für deine Antwort, aber ich habe wegen dieser Sache noch eine Frage:
Ich möchte im untenstehenden Programm die Bereiche Ausgabe, Berechnung... aufteilen in die entsprechenden Methoden.
Wie verhält sich das denn dann mit der do-while schleife? Ich hab darauf noch keine Lösung gefunden.

Java:
public class rechenuebungen
{

    public static Scanner scan = new Scanner(System.in);
    public static void main(String[] args)
    {
        int aw = 4;
        do
        {
            System.out.println("Bitte wählen Sie eine Option: ");
            System.out.println("1. Addieren\n2. Subtrahieren\n3. Multiplizieren\n4. Dividieren\n0. Beenden\n");
            aw = scan.nextInt();
            
            
            
            int a = (int) (1 + Math.random() *100);
            int b = (int) (1 + Math.random() *100);
            int c[] = new int[3];
            
            switch(aw)
            {
            case 1: c[0] = a + b; System.out.printf("Bitte berechne %d + %d\n", a, b);
            c[1] = scan.nextInt();break;
            case 2: c[0] = a - b; System.out.printf("Bitte berechne %d - %d\n", a, b);
            c[1] = scan.nextInt();break;
            case 3: c[0] = a * b; System.out.printf("Bitte berechne %d * %d\n", a, b);
            c[1] = scan.nextInt();break;
            case 4: c[0] = a / b; System.out.printf("Bitte berechne %d / %d\n", a, b);
            c[1] = scan.nextInt();break;
            }
            if((c[0] == c[1]) && (aw != 0))
                System.out.println("Das war richtig!\n\n");
            if((c[0] != c[1]) && (aw != 0))
                System.out.printf("Das war falsch. Lösung: %d\n\n", c[0]);
        }
        while(aw != 0);
        System.out.println("\n\nPROGRAMM BEENDET!");
    }
}
 
J

JustNobody

Du kannst zusammenhängende Blöcke einfach in eine Methode verschieben und Du musst dann nur schauen, dass Daten, die rein/raus gehen, abgebildet werden. Beispiel:
Java:
            System.out.println("Bitte wählen Sie eine Option: ");
            System.out.println("1. Addieren\n2. Subtrahieren\n3. Multiplizieren\n4. Dividieren\n0. Beenden\n");
            aw = scan.nextInt();
Was für Daten werden da genutzt?
- System.out ist global verfügbar, also auch in einer anderen Methode.
- scan wird benutzt- ist in der Klasse also auch aus einer anderen Methode nutzbar.
==> Genutzte Daten haben wir also keine.

Was für Daten werden geschrieben?
- es wird etwas in aw geschrieben, einer lokalen Variable. Die ist natürlich in einer anderen Methode nicht verfügbar.
--> Lösungsmöglichkeit 1: Wir machen die Variable verfügbar.
--> Lösungsmöglichkeit 2: Wir geben den Wert zurück. Das probieren wir einfach mal:

Java:
      int menu() {
            System.out.println("Bitte wählen Sie eine Option: ");
            System.out.println("1. Addieren\n2. Subtrahieren\n3. Multiplizieren\n4. Dividieren\n0. Beenden\n");
            return scan.nextInt();
      }
In der eigentlichen Methode bleibt dann nur noch:
aw = menu();
 
Thema: 

Scanner-Error

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben