Fehlermeldung bei Aufruf von Methode

foreverqt

Mitglied
Hey kurze Frage:
wenn ich mein Programm ausführe kann ich meine Auswahl (1-4) treffen und die das Programm bittet mich darum meine Flugnummer einzugeben. Aber ab dem Moment bricht es ab und ich kann nicht mal mehr etwas eingeben obwohl ich der Meinung bin das mit dem Scanner für die Methode "flugNummer" alles richtig gemacht zu haben...

Fehlermeldung in der Konsole ist folgende:
Exception in thread "main" java.util.NoSuchElementException: No line found
at java.base/java.util.Scanner.nextLine(Scanner.java:1677)
at Aufgabe2/Aufgabe2.Main.flugNummer(Main.java:59)
at Aufgabe2/Aufgabe2.Main.ausgabe(Main.java:68)
at Aufgabe2/Aufgabe2.Main.main(Main.java:41)

Danke schonmal für die Hilfe

Code:
package Aufgabe2;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        
    String pfad ="nummerSechs.csv";
    File file = new File(pfad);
    BufferedReader bRead = null;
    int i = 0;
    String[][] flugdaten = new String[10][4];
    
    //Übernahme der Flugdaten aus .csv Datei und Speicherung in einem
    //zweidimensionalen Array
    //mittels trim() werden sofort alle unnötigen Leerzeichen entfernt,
    //sodass die Daten bereits korrekt abgelegt werden können
    try {
        bRead = new BufferedReader(new FileReader(file));
        String zeile = null;
        
        while((zeile = bRead.readLine()) != null) {
            String[] zwSpeicher = zeile.split(",");
            flugdaten[i][0] = (zwSpeicher[0].trim());
            flugdaten[i][1] = zwSpeicher[1].trim();
            flugdaten[i][2] = zwSpeicher[2].trim();
            flugdaten[i][3] = zwSpeicher[3].trim();
            i++;
            }       
        bRead.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    
    int eing = programmWahl();
    ausgabe(flugdaten, eing);
    
    //ausgabe(flugdaten, eing);
    }
    
    //Eingabeaufforderung und Übernahme der Parameter
    public static int programmWahl() {
        Scanner s = new Scanner(System.in);
        System.out.println("Was möchten Sie tun?");
        System.out.println("1  = Flugdaten einsehen // 2 =  Flugdaten modifizieren // 3 = Flug löschen // 4 =  Nichts, bitte abbrechen");
        int eing = s.nextInt();
        s.close();
        return eing;
        }
    
    public static String flugNummer() {
        Scanner s = new Scanner(System.in);
        System.out.println("Wie lautet die Flugnummer");
        String flugNum = s.nextLine();
        s.close();
        return flugNum;
        }
    
    public static void ausgabe(String[][] flugdaten,int eing) {
        
        switch(eing) {
        case 1:           
            System.out.println(flugNummer());
            
            break;
        case 2:
            System.out.println("2");
            break;
        case 3:
            System.out.println("3");
            break;
        case 4:
            System.out.println("4");
            break;
        default:
            System.out.println("Fehler bei der Eingabe");
            break;
        }
    }

    
    
    
}
 

KonradN

Super-Moderator
Mitarbeiter
Du schließt den Scanner. Damit schließt du auch System.in.

Du solltest den Scanner daher nicht schließen. Du kannst den Scanner auf System.in als Klassenvariable erstellen und dann von überall aus nutzen.
 

foreverqt

Mitglied
Danke für den Tipp, das hat meine Fehlermeldung behoben allerdings lässt er mich jetzt trotzdem nichts eintippen auf der Konsole :D

Habe den Code folgendermaßen abgeändert

Java:
//Eingabeaufforderung und Übernahme der Parameter
    public int programmWahl() {
        System.out.println("Was möchten Sie tun?");
        System.out.println("1  = Flugdaten einsehen // 2 =  Flugdaten modifizieren // 3 = Flug löschen // 4 =  Nichts, bitte abbrechen");
        int eing = s.nextInt();
        return eing;
        }
    
    public String flugNummer() {
        System.out.println("Wie lautet die Flugnummer");
        String flugNum = s.nextLine();
        return flugNum;
        }
    
    public void ausgabe(String[][] flugdaten,int eing) {
        int i = 0;
        StringBuffer buf = new StringBuffer();
        String flugnummer = flugNummer();
        while (flugdaten[i][1] != null) {
            //System.out.println(flugdaten[i][1]);
            if(flugdaten[i][1].equals(flugnummer)) {
                for(int j = 0; j <= 3; j++) {
                    
                    buf.append(flugdaten[i][j]);
                    buf.append(" ");
                    System.out.println(flugdaten[i][j]);
                }
                
            }
            
            i++;
        }
        System.out.println(buf.toString());
        
    }
 

KonradN

Super-Moderator
Mitarbeiter
Das Problem ist die Art der Nutzung von Scanner. Du kannst den Scanner entweder Token basiert oder Zeilen orientiert nutzen.

nextInt ist eine Merhode, die Tokenorientiert arbeitet. Dabei werden erst mögliche Trennzeichen gelesen, dann Zeichen bis wieder ein Trennzeichen kommt. Nehmen wir das Beispiel:
Eingabe „1\n“ (\n ist der Zeilenumbruch / Enter Taste“
Ein nextInt Aufruf liest nun die 1 aber lässt das \n noch im Eingabepuffer.

Das nextLine lädt alle Zeichen einschließlich dem \n.

Was passiert nun bei einem nextInt + folgendem nextLine Aufruf?

Bei dem nextInt gibst du 1\n ein, die 1 wird gelesen und zurück gegeben. Das nextLine ließt nun das \n ein und gibt direkt den leeren String zurück.

Was ist die Lösung?
Wenn du nach einer Token basierten Eingabe eine Zeilen basierte Eingabe machen willst, musst du den Zeilenwechsel auslesen. Das kannst du mit einem einfachen nextLine Aufruf machen. Also einfach ein zusätzlichen Aufruf von nextLine hinzufügen. (Man könnte es noch etwas komplexer aufbauen, aber für die Übungen zum Java lernen sollte dies so ausreichen)
 

KonradN

Super-Moderator
Mitarbeiter
Ok, nur als kleine Information: Das war mal wieder unser Foren-Troll, der auf Grund seines Verhaltens immer wieder gebannt wird und dann neue Accounts erstellt. Mehr wichtige Punkte gibt es dazu nicht.

Wenn man sich aber für die Thematik etwas mehr interessiert, dann wäre hier das Folgende aus meiner Sicht zu sagen (Aber für jemanden, der Java Grundlagen erlernen will, eher uninteressant).

Der Hinweis aus der verlinken SO Antwort besagte einfach, dass man den Puffer vom Scanner nicht direkt löschen kann. Das ist klar, denn der Puffer ist halt gekapselt im Scanner und da hat man keinen direkten Zugriff drauf. ==> Diesen Puffer wollte ich aber auch nie löschen oder irgendwie direkt beeinflussen.

Aber natürlich kann man vom Scanner lesen - so kann man eine Zeile lesen. Und das wurde da auch dann im SO Thread, der verlinkt wurde, angegeben.

Der Foren-Troll "Tobias" möchte aber als Lösung vermutlich weiterhin, dass man immer neue Instanzen von Scanner erzeugt (So ich mich richtig erinnere). Also statt eine Scanner-Instanz zu erzeugen und zu nutzen, hast Du immer Aufrufe wie:
new Scanner(System.in).nextint();
Du erzeugst also eine Instanz, rufst die Methode auf und danach wird die Instanz verworfen.

Das kommt mit mehreren Problemen daher:
  • Der erste Punkt ist Clean Code / Performance: Man erzeugt nicht ständig Instanzen um diese dann sofort vom Garbage Collector wieder entsorgen zu lassen.
  • Was alles im Puffer ist, ist nicht prüfbar. Das sollte deutlich kontrollierter gehandhabt werden. (Wenn man mehrere int Werte einfordert, dann kann das ja auch direkt eingegeben werden. Also wenn zwei nextInt() Aufrufe kommen, dann kann man z.B. schreiben: "1 2" - dann gibt der erste nextInt Aufruf 1 und der Zweite dann eine 2 zurück.)
  • Clean Code: Scanner implementiert AutoCloseable - da sollte immer ein close() sichergestellt sein. Dazu gibt es dann z.B. in Java das try with resources. Aber das will man hier auch explizit nicht, da dies ja das System.in schließen würde. Das Thema wurde schon mehrfach besprochen im Forum mit Ideen wie System.in zu wrappen, das dann das close() nicht weiter gibt oder eben, dass man es als public static final in einer Klasse deklariert und damit hat man einen Lebenszyklus, der bis zum Ende der Runtime geht und man daher kein close() braucht (Stimmt nicht ganz, streng genommen kann auch eine geladene Klasse vom GC entfernt werden. Aber das ist definitiv nichts mehr für Anfänger.)

Wenn man sich dann ganz intensiv damit beschäftigen will, dann kann man mit dem Scanner auch eine deutlich bessere Lösung aufbauen. Ideen dazu:
  • Tracking, ob denn zuletzt eine Token-Basierte Methode oder eben eine Zeilen orientierte Methode aufgerufen wurde.
  • Wenn der Wechsel von Token basiert zu Zeilen basiert erfolgt, wird die Rückgabe ausgewertet: Ist diese leer, dann wird erneut die Zeile gelesen (das ist halt die einzige Zeilen basierte Methode). Ist diese nicht leer, hat man eine Eingabe auf der Zeile gehabt. (Ob man die auswerten will, muss man sich dann überlegen. Das erlaubt eine schnellere Eingabe ...)
  • Wenn man die Auswertung der ersten Rückgabe von nextLine machen will, muss man noch überlegen: Will man die Trennzeichen mit nehmen oder nicht? Also will man (ein oder die?) führende(s/n) Trennzeichen entfernen?
Hier ist also viel möglich, was man noch machen könnte. Aber es geht bei so Aufgaben doch um ein Erlernen von Java Grundlagen, und da spielt das absolut keine Rolle!
 

dasproblem

Neues Mitglied
Der Hinweis aus der verlinken SO Antwort besagte einfach, dass man den Puffer vom Scanner nicht direkt löschen kann. Das ist klar, denn der Puffer ist halt gekapselt im Scanner und da hat man keinen direkten Zugriff drauf. ==> Diesen Puffer wollte ich aber auch nie löschen oder irgendwie direkt beeinflussen.
Was ein Designfehler des Scanners ist.

Der Foren-Troll "Tobias" möchte aber als Lösung vermutlich weiterhin, dass man immer neue Instanzen von Scanner erzeugt
Wieso nimmst du an, dass er das möchte?

Der erste Punkt ist Clean Code / Performance: Man erzeugt nicht ständig Instanzen um diese dann sofort vom Garbage Collector wieder entsorgen zu lassen.
Performance bei Benutzereingaben?
 

KonradN

Super-Moderator
Mitarbeiter
Ach Tobias,

Was ein Designfehler des Scanners ist.
Die Kapselung von Daten in der Klasse Scanner ist ein Designfehler?

Wieso nimmst du an, dass er das möchte?
Du hast selbst behauptet, in der Vergangenheit etwas zu Scannern geschrieben zu haben … Ich habe nur versucht, mich zu erinnern.,,.


Performance bei Benutzereingaben?
System.in ist das stdin der Anwendung - das müssen nicht Benutzereingaben sein.

Und bei Clean Code geht es um das Prinzip.

Ich habe Deine Antwort mal nicht mit gelöscht, da die eine oder Andere Anfängerfrage durchaus interessant sein kann …
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Fehlermeldung beim aufruf der main Methode Java Basics - Anfänger-Themen 17
S Fehlermeldung beim Aufruf einer Methode Java Basics - Anfänger-Themen 3
F Bei Aufruf von java.exe -> Fehlermeldung Java Basics - Anfänger-Themen 11
Ronny123 Erste Schritte Fehlermeldung Java Basics - Anfänger-Themen 1
F Fehlermeldung in Eclipse Java Basics - Anfänger-Themen 13
AllBlack Fehlermeldung Java Basics - Anfänger-Themen 19
Finn_lol Fehlermeldung bei Schleife mit Array Java Basics - Anfänger-Themen 4
N Ich kriege ganze zeit die Fehlermeldung "Inhalt der Zwischenablage kann nicht in die ausgewählten Elemente eingefügt werden" hat jemand eine Lösung? Java Basics - Anfänger-Themen 6
P Java Selenium . Parameterized.Parameters erzeugt eine Fehlermeldung Java Basics - Anfänger-Themen 14
J Fehlermeldung unverständlich für Jakarta Java Basics - Anfänger-Themen 17
Ostkreuz Fehlermeldung Java Basics - Anfänger-Themen 1
_so_far_away_ Fehlermeldung "Index 2 out of bounds for length 2" Java Basics - Anfänger-Themen 7
W Texteingabe - Bedeutung Fehlermeldung, Lösung? Java Basics - Anfänger-Themen 18
krgewb Fehlermeldung in web.xml Java Basics - Anfänger-Themen 4
W Warum diese Fehlermeldung? Java Basics - Anfänger-Themen 12
nbergmann Unverständliche Fehlermeldung Java Basics - Anfänger-Themen 56
E fehlermeldung bei richtigen login daten Java Basics - Anfänger-Themen 7
J Fehlermeldung im Checkstyle Java Basics - Anfänger-Themen 11
S Fehlermeldung Java Basics - Anfänger-Themen 7
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
EchtKeineAhnungManchmal Hallo :) ich bekomme es nicht hin eine Fehlermeldung auszugeben über die GUI Java Basics - Anfänger-Themen 3
C Fehlermeldung Array zuweisen und printen Java Basics - Anfänger-Themen 22
J Fehlermeldung Java Basics - Anfänger-Themen 22
J Fehlermeldung: A JNI error Java Basics - Anfänger-Themen 3
R Fehlermeldung aber WO liegt der Fehler? Java Basics - Anfänger-Themen 7
JavaClara Fehlermeldung bei split-Methode Java Basics - Anfänger-Themen 12
F Fehlermeldung java.lang.NullPointerException Java Basics - Anfänger-Themen 4
C Fehlermeldung InOut. Java Basics - Anfänger-Themen 7
B Methoden if-statement error, FX, Fehlermeldung Java Basics - Anfänger-Themen 6
A Fehlermeldung Java Basics - Anfänger-Themen 5
H Comparator Fehlermeldung Java Basics - Anfänger-Themen 5
D Folgende Fehlermeldung bei der Installation von JAVAFX Java Basics - Anfänger-Themen 1
M Java heap space Fehlermeldung beheben Java Basics - Anfänger-Themen 3
J Fehlermeldung unklar. non-static variable player0 cannot be referenced from a static context Java Basics - Anfänger-Themen 4
T Fehlermeldung beim Versuch, einen String einzulesen Java Basics - Anfänger-Themen 4
S Bitte Hilfe zu Fehlermeldung am Handy Java Basics - Anfänger-Themen 2
H fehlermeldung Java Basics - Anfänger-Themen 447
H fehlermeldung Java Basics - Anfänger-Themen 9
T Fehlermeldung beim Starten von FlashTool Java Basics - Anfänger-Themen 27
C Fehlermeldung mit Intger. Java Basics - Anfänger-Themen 3
A Fehlermeldung Java Basics - Anfänger-Themen 3
D Wie kann man eine solche Fehlermeldung abfangen Java Basics - Anfänger-Themen 4
H Fehlermeldung bei der Ausführung eines Compilierten PRGs Java Basics - Anfänger-Themen 9
N Fehlermeldung beim ausführen des Programmes.. Java Basics - Anfänger-Themen 3
x-tshainge Fehlermeldung Java Basics - Anfänger-Themen 2
M Erste Schritte NetBeans Fehlermeldung Java Basics - Anfänger-Themen 2
D Fehlermeldung obwohl Variablen bereits deklariert sind? Java Basics - Anfänger-Themen 14
N Fehlermeldung bei Methode Java Basics - Anfänger-Themen 12
I String index out of range Fehlermeldung Java Basics - Anfänger-Themen 4
I Fehlermeldung bei Darstellung von Arrays Java Basics - Anfänger-Themen 2
S Variablen JLabel backImagePanel Fehlermeldung Java Basics - Anfänger-Themen 3
A checkstyle Fehlermeldung Java Basics - Anfänger-Themen 1
G Compiler-Fehler Fehlermeldung Java Basics - Anfänger-Themen 3
Pr0m3theus Fehlermeldung ArrayList add Java Basics - Anfänger-Themen 12
Arabicabohne Fehlermeldung bei Eclipse Java Basics - Anfänger-Themen 23
lBlKha0s Fehlermeldung : class interface or enum expected Java Basics - Anfänger-Themen 9
TheMenox Fehlermeldung / Arrays, Enhanced For Loops Java Basics - Anfänger-Themen 16
D Compiler-Fehler Anfänger Fehlermeldung Java Basics - Anfänger-Themen 3
Henri Fehlermeldung Java Basics - Anfänger-Themen 2
K Erste Schritte Fehlermeldung Java Basics - Anfänger-Themen 2
I Fehlermeldung: Java does not contain a main type Java Basics - Anfänger-Themen 1
J Fehlermeldung : cannot invoke char(at) int on the primitive type int --- Anfänger Java Basics - Anfänger-Themen 5
J Bug? Seltsame Fehlermeldung Java Basics - Anfänger-Themen 7
J Fehlermeldung else without if Java Basics - Anfänger-Themen 5
J while(nst == 0) gibt Fehlermeldung Java Basics - Anfänger-Themen 4
L Fehlermeldung Java Basics - Anfänger-Themen 6
D Erste Schritte Fehlermeldung "Syntax error on token ";", { expected after this token" Java Basics - Anfänger-Themen 13
J Launcher Fehlermeldung Java Basics - Anfänger-Themen 0
A Fehlermeldung Unklar, google hilft auch nicht weiter Java Basics - Anfänger-Themen 2
H Compiler-Fehler Fehlermeldung Kompilier Java Basics - Anfänger-Themen 4
A Fehlermeldung Unklar. Java Basics - Anfänger-Themen 1
A Code läuft nicht, Fehlermeldung Exception in thread "main" java.lang.Error: Unresolved compilation " Java Basics - Anfänger-Themen 11
D Integer Fehlermeldung exception Java Basics - Anfänger-Themen 4
D Fehlermeldung beim Ausführen eines Java Programms Java Basics - Anfänger-Themen 4
H Kein Zugriff auf das Element einer JList möglich: Fehlermeldung Java Basics - Anfänger-Themen 2
S Vererbung Fehlermeldung: the hierarchy of the type "class name" is inconsistent Java Basics - Anfänger-Themen 10
D Fehlermeldung "com.element.JavaUpload.Manager" Java Basics - Anfänger-Themen 1
S Fehlermeldung bei format methode Java Basics - Anfänger-Themen 1
A Compiler-Fehler Fehlermeldung auf Mac Java Basics - Anfänger-Themen 3
K JDBC - Wie ist Fehlermeldung zu interpretieren Java Basics - Anfänger-Themen 3
O Methoden Fehlermeldung(Illegal start of expression) bei 4-Gewinnt-Spiel Java Basics - Anfänger-Themen 5
N Fehlermeldung nicht nachvollziehbar Java Basics - Anfänger-Themen 5
S Class File Editor gibt beim Start der Programms die Fehlermeldung Source not found aus Java Basics - Anfänger-Themen 1
C addActionListener(this) - Fehlermeldung Java Basics - Anfänger-Themen 8
C Array List mit String vergleichen und Fehlermeldung ausgeben Java Basics - Anfänger-Themen 6
X Einfach verkettete Liste, keine Fehlermeldung Programm friert ein Java Basics - Anfänger-Themen 4
G Variablen Warum bekomme ich da eine Fehlermeldung? Java Basics - Anfänger-Themen 3
C GUI - SWT - Button-Fehlermeldung Java Basics - Anfänger-Themen 5
F Input/Output IOTools Fehlermeldung: cannot be resolved Java Basics - Anfänger-Themen 16
K Erste Schritte Datei gelöscht - nun Fehlermeldung Java Basics - Anfänger-Themen 2
S Fehlermeldung Java Basics - Anfänger-Themen 8
E Fehlermeldung und Fenster wird nicht mehr angezeigt Java Basics - Anfänger-Themen 12
E Fehlermeldung Java Basics - Anfänger-Themen 13
K Transparents Bild laden -> Fehlermeldung Java Basics - Anfänger-Themen 6
J Fehlermeldung reagieren Java Basics - Anfänger-Themen 10
F Array Fehlermeldung... Java Basics - Anfänger-Themen 2
B Fehlermeldung bei Klasse mit array Java Basics - Anfänger-Themen 3
L Erste Schritte Fehlermeldung bei Array-Programm Java Basics - Anfänger-Themen 4
G Fehlermeldung: A fatal error has been detected by the Java Runtime Environment Java Basics - Anfänger-Themen 7
Gugelhupf JDK installieren Fehlermeldung 1336 - Java SDK 7 Update 5 x64 Java Basics - Anfänger-Themen 4

Ähnliche Java Themen


Oben