# NoSuchElementException - Scanner Fehler



## Lights (16. Okt 2018)

Hallo,
ich hatte mich letztens schon mal mit meinem Morsecode Programm gemeldet, das läuft mittlerweile auch ganz gut, nun habe ich aber Fehler an dem ich einfach nicht weiter komme, wobei ich das schon tausend mal gemacht habe. Es geht ums einscannen


```
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;


public class Morsecode {

    Map<String, Character> Mcode = new HashMap<String, Character>();

    public void Kodierung() {

        Mcode.put(".-", 'A');

        Mcode.put("-...", 'B');

        Mcode.put("-.-.", 'C');

        Mcode.put("-..", 'D');

        Mcode.put(".", 'E');

        Mcode.put("..-.", 'F');

        Mcode.put("--.", 'G');

        Mcode.put("....", 'H');

        Mcode.put("..", 'I');

        Mcode.put(".---", 'J');

        Mcode.put("-.-", 'K');

        Mcode.put(".-..", 'L');

        Mcode.put("--", 'M');

        Mcode.put("-.", 'N');

        Mcode.put("---", 'O');

        Mcode.put(".--.", 'P');

        Mcode.put("--.-", 'Q');

        Mcode.put(".-.", 'R');

        Mcode.put("...", 'S');

        Mcode.put("-", 'T');

        Mcode.put("..-", 'U');

        Mcode.put("...-", 'V');

        Mcode.put(".--", 'W');

        Mcode.put("-..-", 'X');

        Mcode.put("-.--", 'Y');

        Mcode.put("--..", 'Z');

        Mcode.put("-----", '0');

        Mcode.put(".----", '1');

        Mcode.put("..---", '2');

        Mcode.put("...--", '3');

        Mcode.put("....-", '4');

        Mcode.put(".....", '5');

        Mcode.put("-....", '6');

        Mcode.put("--...", '7');

        Mcode.put("---..", '8');

        Mcode.put("----.", '9');

        Mcode.put(".-.-.-", '.');

        Mcode.put("", ' ');

    }

    public String einlesen() throws IOException {
        Scanner einlese = new Scanner(System.in);
        String in;
        System.out.println("Bitte Morsecode eingeben: \n");

        in = einlese.nextLine();

        if (in.isEmpty()) {
            System.out.println("Leere oder fehlerhafte Eingabe");
            einlese.close();
            throw new IOException();
        }

        String ab;
        System.out.println("Um Ihre Eingabe einzusehen tippen sie 1: ");
        ab = einlese.nextLine();

        if (ab.equals("1")) {

            System.out.println("Ihre Eingabe: " + in);
        }

        else {

        }

        einlese.close();

        return in;

    }

    public void umwandeln() throws IOException {

        String ein = einlesen();

        StringBuilder Liste = new StringBuilder();

        String Woerter[] = ein.split(" ");

        for (int i = 0; i < Woerter.length; ++i) {
            String einzelneBuchstaben = Woerter;

            String BuchstabenArray[] = einzelneBuchstaben.split(" ");

            for (int c = 0; c < BuchstabenArray.length; ++c) {

                Liste.append(Mcode.get(BuchstabenArray[c]));

            }

        }

        System.out.println("A: Text wird auf dem Bildschirm ausgegeben");
        System.out.println("B: Text wird in eine externe Datei gespeichert");
        System.out.println(" ");
        Scanner scan = new Scanner(System.in);
        String input = scan.nextLine();

        switch (input) {

        case "A":
            System.out.println(Liste.toString()); // Ausgabe des umgewandelten Codes
            break;

        case "B":
            TextToFile(Liste.toString());
            break;

        }

        // Statistik der Umwandlung

        float anzB = 0;

        for (char c1 : Liste.toString() // Berechnung der Statistik für die Anzahl der Buchstaben
                            .toCharArray()) {
            if (c1 != ' ') {
                anzB++;
            }
        }

        float anzW = 0;

        for (char c3 : Liste.toString()
                            .toCharArray()) {
            if (c3 == ' ') {
                anzW++;
            }

        }
        anzW += 1; // Anzahl der Wörter wird nochmal hochgezählt dar der Code die Anzahl der Wörter
                   // anhand der Anzahl der Leerzeichen zwischen den Wörter errechnet, so würde immer
                   // ein Wort fehlen wenn man anzW nicht am Ende immer um 1 erhöht

        // Durschnitt Der Wörter

        float dw;

        dw = anzB / anzW;

        System.out.println("------ Statistik ------");
        System.out.println("Anzahl der Buchstaben: " + anzB);
        System.out.println("Anzahl der Wörter: " + anzW);
        System.out.println("Durschnittslänge der Wörter : " + dw);
        System.out.println("-----------------------");

    }

    public void CodeFromFile() throws FileNotFoundException {
        File CodeFile = new File("MorseCode.txt");
        Scanner rein = new Scanner(CodeFile);

        while (rein.hasNext()) {
            char Buchstabe = rein.next()
                                 .charAt(0);
            String code = rein.next();
            Mcode.put(code, Buchstabe);

        }
    }

    public void TextFromFile() throws FileNotFoundException, IOException {

        File morseCode = new File("message.txt");
        BufferedReader bufferedReader = new BufferedReader(new FileReader(morseCode));
        String line;
        String letter;
        float anzW = 0;
        float anzB = 0;
        float dw = 0;

        while ((line = bufferedReader.readLine()) != null) {
            letter = "";

            for (String morseLetter : line.split(" ")) {
                letter = Mcode.get(morseLetter)
                              .toString();
                System.out.print(letter);

                for (char a : letter.toString() // Die Anzahl der Buchstaben werden gezählt
                                    .toCharArray()) {
                    if (a != '.') {
                        anzB++;
                    }
                }

            }

            if (letter.equals(".")) {
                // Zeilenumbruch
                System.out.println();
            } else {
                // Leerzeichen
                System.out.print(' ');

            }

            anzW++; // Für jeden Schleifendurchlauf wird der Zähler erhöht = Anzahl der Wörter
                    // dar in jedem durchlauf ein Wort eingelesen wird
        }

        dw = anzB / anzW;
        System.out.println("------ Statistik ------");
        System.out.println("Anzahl der Buchstaben: " + anzB);
        System.out.println("Anzahl der Wörter: " + anzW);
        System.out.println("Durschnittslänge der Wörter : " + dw);
        System.out.println("-----------------------");
    }

    public void Menue() throws IOException {

        System.out.println("-------------------------------------------");
        System.out.println("-- Willkommen im MorseCode-De/Enkodierer --");
        System.out.println("-------------------------------------------");
        System.out.println("Wähle Sie eine Option aus!");
        System.out.println("A: Einlesen der Kodierung über das Programm");
        System.out.println("B: Einlesen der Kodierung über externe Datei");
        System.out.println(" ");
        Scanner scan = new Scanner(System.in);
        String input = scan.nextLine();

        switch (input) {

        case "A":
            Kodierung();
            if (Mcode.isEmpty()) {
                System.out.println("Einlesen Fehlgeschlagen!");
                break;
            } else {
                System.out.println("Einlesen der Kodierung Erfolgreich!");
                break;
            }

        case "B":
            try {
                CodeFromFile();
                if (Mcode.isEmpty()) {
                    System.out.println("Einlesen Fehlgeschlagen!");
                    break;
                } else {
                    System.out.println("Einlesen der Kodierung Erfolgreich!");
                    break;
                }

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }

        System.out.println("Wähle Sie eine Option aus!");
        System.out.println("A: Einlesen Ihres Codes per Manueller Eingabe");
        System.out.println("B: Einlesen Ihres Codes per Externer Datei");

        String secin = scan.nextLine();

        switch (secin) {

        case "A":
            umwandeln();
            break;

        case "B":
            try {
                TextFromFile();
                break;
            } catch (IOException e) {

                e.printStackTrace();
            }

        }
    }

    public void TextToFile(String test) throws IOException {
        FileWriter fw = new FileWriter("DeinText.txt");
        BufferedWriter bw = new BufferedWriter(fw);

        bw.write(test);

    }

    public static void main(String[] args) {

        Morsecode mors = new Morsecode();

        try {
            mors.Menue();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}
```


_
Wenn ich das Programm ausführe bekomme ich in der Methode Umwandeln() eine NoSuchElementException die sich auf das einscannen bezieht, ich hab in dem Codes bereits mehrere Scans verwendet. Deshalb verstehe ich nicht warum es jetzt nicht mehr funktioniert. Ich hoffe ihr könnt mit weiterhelfen 



		Java:In die Zwischenablage kopieren


Exception in thread "main" java.util.NoSuchElementException: No line found
    at java.util.Scanner.nextLine(Unknown Source)
    at großeJavaAufgabe.Morsecode.umwandeln(Morsecode.java:158)
    at großeJavaAufgabe.Morsecode.Menue(Morsecode.java:320)
    at großeJavaAufgabe.Morsecode.main(Morsecode.java:348)

_


----------



## Flown (16. Okt 2018)

Du schließt den Scanner, welcher auch den darunter liegenden InputStream (somit System.in) auch schließt: `einlese.close();`.
Nimm das `close()` raus und dann sollte es funktionieren.


----------



## Lights (16. Okt 2018)

Tatsächlich, vielen dank, aber warum ist das so ? Zu einem befindet sich der Scanner doch in der Methode davor und zum anderen ist das ja der Scanner einlese, warum bezieht sich das Close dann auch auf meinen neuen Scanner ?


----------



## mihe7 (16. Okt 2018)

Weil beide den selben InputStream (System.in) verwenden.


----------



## Lights (16. Okt 2018)

okey, eine Frage habe ich, ich möchte jetzt den Code aus einer Datei einlesen (was auch klappt) und ihn dann direkt in eine Datei speichern. Da das lesen (TextFromFile()) in einer while schleife abläuft speichert er mir immer nur das letze zeichen wie kann ich das ändern ?


```
package großeJavaAufgabe;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Morsecode {

    Map<String, Character> Mcode = new HashMap<String, Character>();

    public void Kodierung() {

        Mcode.put(".-", 'A');

        Mcode.put("-...", 'B');

        Mcode.put("-.-.", 'C');

        Mcode.put("-..", 'D');

        Mcode.put(".", 'E');

        Mcode.put("..-.", 'F');

        Mcode.put("--.", 'G');

        Mcode.put("....", 'H');

        Mcode.put("..", 'I');

        Mcode.put(".---", 'J');

        Mcode.put("-.-", 'K');

        Mcode.put(".-..", 'L');

        Mcode.put("--", 'M');

        Mcode.put("-.", 'N');

        Mcode.put("---", 'O');

        Mcode.put(".--.", 'P');

        Mcode.put("--.-", 'Q');

        Mcode.put(".-.", 'R');

        Mcode.put("...", 'S');

        Mcode.put("-", 'T');

        Mcode.put("..-", 'U');

        Mcode.put("...-", 'V');

        Mcode.put(".--", 'W');

        Mcode.put("-..-", 'X');

        Mcode.put("-.--", 'Y');

        Mcode.put("--..", 'Z');

        Mcode.put("-----", '0');

        Mcode.put(".----", '1');

        Mcode.put("..---", '2');

        Mcode.put("...--", '3');

        Mcode.put("....-", '4');

        Mcode.put(".....", '5');

        Mcode.put("-....", '6');

        Mcode.put("--...", '7');

        Mcode.put("---..", '8');

        Mcode.put("----.", '9');

        Mcode.put(".-.-.-", '.');

        Mcode.put("", ' ');

    }

    public String einlesen() throws IOException {
        Scanner einlese = new Scanner(System.in);
        String in;
        System.out.println("Bitte Morsecode eingeben: \n");

        in = einlese.nextLine();

        if (in.isEmpty()) {
            System.out.println("Leere oder fehlerhafte Eingabe");
            einlese.close();
            throw new IOException();
        }

        String ab;
        System.out.println("Um Ihre Eingabe einzusehen tippen sie 1: ");
        ab = einlese.nextLine();

        if (ab.equals("1")) {

            System.out.println("Ihre Eingabe: " + in);
        }

        else {

        }

        return in;

    }

    public void umwandeln() throws IOException {

        String ein = einlesen();

        StringBuilder Liste = new StringBuilder();

        String Woerter[] = ein.split(" ");

        for (int i = 0; i < Woerter.length; ++i) {
            String einzelneBuchstaben = Woerter[i];

            String BuchstabenArray[] = einzelneBuchstaben.split(" ");

            for (int c = 0; c < BuchstabenArray.length; ++c) {

                Liste.append(Mcode.get(BuchstabenArray[c]));

            }

        }

        System.out.println("A: Text wird auf dem Bildschirm ausgegeben");
        System.out.println("B: Text wird in eine externe Datei gespeichert");
        System.out.println(" ");
        Scanner scanin = new Scanner(System.in);
        String input = scanin.nextLine();

        switch (input) {

        case "A":
            System.out.println(Liste.toString()); // Ausgabe des umgewandelten Codes
            break;

        case "B":
            TextToFile(Liste.toString());
            break;

        }

        // Statistik der Umwandlung

        float anzB = 0;

        for (char c1 : Liste.toString() // Berechnung der Statistik für die Anzahl der Buchstaben
                            .toCharArray()) {
            if (c1 != ' ') {
                anzB++;
            }
        }

        float anzW = 0;

        for (char c3 : Liste.toString()
                            .toCharArray()) {
            if (c3 == ' ') {
                anzW++;
            }

        }
        anzW += 1; // Anzahl der Wörter wird nochmal hochgezählt dar der Code die Anzahl der Wörter
                   // anhand der Anzahl der Leerzeichen zwischen den Wörter errechnet, so würde immer
                   // ein Wort fehlen wenn man anzW nicht am Ende immer um 1 erhöht

        // Durschnitt Der Wörter

        float dw;

        dw = anzB / anzW;

        System.out.println("------ Statistik ------");
        System.out.println("Anzahl der Buchstaben: " + anzB);
        System.out.println("Anzahl der Wörter: " + anzW);
        System.out.println("Durschnittslänge der Wörter : " + dw);
        System.out.println("-----------------------");

    }

    public void CodeFromFile() throws FileNotFoundException {
        File CodeFile = new File("MorseCode.txt");
        Scanner rein = new Scanner(CodeFile);

        while (rein.hasNext()) {
            char Buchstabe = rein.next()
                                 .charAt(0);
            String code = rein.next();
            Mcode.put(code, Buchstabe);

        }
    }

    public void TextFromFile() throws FileNotFoundException, IOException {

        File morseCode = new File("message.txt");
        BufferedReader bufferedReader = new BufferedReader(new FileReader(morseCode));
        String line;
        String letter;
        float anzW = 0;
        float anzB = 0;
        float dw = 0;

        while ((line = bufferedReader.readLine()) != null) {
            letter = "";

            for (String morseLetter : line.split(" ")) {
                letter = Mcode.get(morseLetter)
                              .toString();
                System.out.print(letter);
           
                for (char a : letter.toString() // Die Anzahl der Buchstaben werden gezählt
                                    .toCharArray()) {
                    if (a != '.') {
                        anzB++;
                    }
                }

            }

            if (letter.equals(".")) {
                // Zeilenumbruch
                System.out.println();
            } else {
                // Leerzeichen
                System.out.print(' ');

            }

            TextToFile(letter);
            anzW++; // Für jeden Schleifendurchlauf wird der Zähler erhöht = Anzahl der Wörter
                    // dar in jedem durchlauf ein Wort eingelesen wird
        }

        dw = anzB / anzW;
        System.out.println("------ Statistik ------");
        System.out.println("Anzahl der Buchstaben: " + anzB);
        System.out.println("Anzahl der Wörter: " + anzW);
        System.out.println("Durschnittslänge der Wörter : " + dw);
        System.out.println("-----------------------");
    }

    public void Menue() throws IOException {

        System.out.println("-------------------------------------------");
        System.out.println("-- Willkommen im MorseCode-De/Enkodierer --");
        System.out.println("-------------------------------------------");
        System.out.println("Wähle Sie eine Option aus!");
        System.out.println("A: Einlesen der Kodierung über das Programm");
        System.out.println("B: Einlesen der Kodierung über externe Datei");
        System.out.println(" ");
        Scanner scan = new Scanner(System.in);
        String input = scan.nextLine();

        switch (input) {

        case "A":
            Kodierung();
            if (Mcode.isEmpty()) {
                System.out.println("Einlesen Fehlgeschlagen!");
                break;
            } else {
                System.out.println("Einlesen der Kodierung Erfolgreich!");
                break;
            }

        case "B":
            try {
                CodeFromFile();
                if (Mcode.isEmpty()) {
                    System.out.println("Einlesen Fehlgeschlagen!");
                    break;
                } else {
                    System.out.println("Einlesen der Kodierung Erfolgreich!");
                    break;
                }

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }

        System.out.println("Wähle Sie eine Option aus!");
        System.out.println("A: Einlesen Ihres Codes per Manueller Eingabe");
        System.out.println("B: Einlesen Ihres Codes per Externer Datei");

        String secin = scan.nextLine();

        switch (secin) {

        case "A":
            umwandeln();
            break;

        case "B":
            try {
                TextFromFile();
                break;
            } catch (IOException e) {

                e.printStackTrace();
            }

        }
    }

    public void TextToFile(String test) throws IOException {
        FileWriter fw = new FileWriter("DeinText.txt");
        BufferedWriter bw = new BufferedWriter(fw);

        if ("DeinText.txt".isEmpty()) {
            System.out.println("if");
            bw.write(test);
        } else {
            System.out.println("else");
            bw.write(test);
        }

        bw.close();

    }

    public static void main(String[] args) {

        Morsecode mors = new Morsecode();

        try {
            mors.Menue();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}
```


----------



## mihe7 (16. Okt 2018)

Nimm einen StringBuilder und füge den letter in der Schleife dazu. Nach der Schleife lässt Du Dir vom StringBuilder den String geben und rufst mit diesem TextToFile auf.


```
StringBuilder b = new StringBuilder();
while (...) {
    String letter = ...;
    b.append(letter);
}
TextToFile(b.toString());
```

Übrigens: Namen von Variablen, Parametern und Methoden schreibt man in Java in lowerCamelCase, Namen von Typen (Klassen, Interfaces, ...) dagegen in UpperCamelCase.


----------

