java.util.NoSuchElementException: No line found

d.nasir

Mitglied
Hallo,
ich bin im ersten Semester des Wirtschaftsinformatiks. Wir haben eine Aufgabe:
"Zwei leere Arrays sollen durch Einlesen von der Tastatur mit Strings gefüllt werden (die Größe
der Arrays wird ebenfalls eingelesen). Diese Arrays werden miteinander vereinigt. Danach soll
das neu entstandene Array alphabetisch sortiert werden. Ist dies erledigt, werden Duplikate aus
dem Array entfernt und das Resultat ausgegeben. Bei der Ausgabe werden die Worte aus dem
Array mit einem Leerzeichen getrennt."
Nun habe ich die Aufgabe wie folgt versucht zu lösen, aber ich bekomme bei der Eingabe des zweiten Arrays die Fehlermeldung "java.util.NoSuchElementException: No line found"
Mein Code:
[Java]public class ArraySpielerei {

public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Bitte geben Sie die Länge des 1.Arrays ein: ");
int n = scanner.nextInt();
String[] array1 = new String[n];

System.out.print("Bitte geben Sie die Länge des 2.Arrays ein: ");
int m = scanner.nextInt();
String[] array2 = new String[m];

System.out.println("1.Array: ");
array1 = readWords(n);

System.out.println("2.Array: ");
array2 = readWords(m);

String[] array = mergeWords(array1, array2);

array = sortWords(array);
array = removeDuplicates(array);
printArray(array);
scanner.close();

}

public static String[] readWords(int sizeOfArray) {
Scanner scanner = new Scanner(System.in);
String[] array = new String[sizeOfArray];
for (int i = 0; i < sizeOfArray; i++) {
System.out.println("Bitte geben Sie " + (i + 1) + ". Wort ein: ");
String words = scanner.nextLine();
array = words;
}
scanner.close();
return array;

}

public static String[] mergeWords(String[] words, String[] words2) {
String[] mergedWords = new String[words.length + words2.length];
int n = 0;
for (int i = 0; i < mergedWords.length; i++) {
if (i < words.length) {
mergedWords = words;
} else {
mergedWords = words2[n];
n++;
}
}
return mergedWords;
}

public static String[] sortWords(String[] toSort) {
Arrays.sort(toSort);
return toSort;
}

public static String[] removeDuplicates(String[] sortedWords) {
for (int i = 0; i < sortedWords.length; i++) {
String erstesWort = sortedWords;
for (int n = i + 1; n < sortedWords.length; n++) {

if (erstesWort.equals(sortedWords[n])) {
String[] sortedWords2 = new String[sortedWords.length - 1];
for (int m = 0; m < i; m++) {
sortedWords2[m] = sortedWords[m];
}
for (int m = i; m < sortedWords2.length; m++) {
sortedWords2[m] = sortedWords[m + 1];
}
return removeDuplicates(sortedWords2);
}

}
}
return sortedWords;
}

public static void printArray(String[] array){
for(int i=0; i<array.length; i++){
System.out.print(array + " ");
}
}
}

[/Java]

Die Fehlermeldung lautet wie folgt:
Exception in thread "main" Bitte geben Sie 1. Wort ein:
java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Scanner.java:1585)
at ArraySpielerei.readWords(ArraySpielerei.java:36)
at ArraySpielerei.main(ArraySpielerei.java:20)

Kann mir Bitte jemand helfen? Denn ich weiß nicht wie ich das ändern soll.
 
Das Problem liegt irgendwo hier :

at java.util.Scanner.nextLine(Scanner.java:1585)
at ArraySpielerei.readWords(ArraySpielerei.java:36)

Dazu müsste man sich deine mergewords / readwords methoden mal genauer ansehen
 
Zuletzt bearbeitet:
So sieht es in der Konsole aus wenn ich das Programm durchführe:

Bitte geben Sie die Länge des 1.Arrays ein: 2
Bitte geben Sie die Länge des 2.Arrays ein: 3
1.Array:
Bitte geben Sie 1. Wort ein:
Informatik
Bitte geben Sie 2. Wort ein:
ist
2.Array:
Exception in thread "main" Bitte geben Sie 1. Wort ein:
java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Scanner.java:1585)
at ArraySpielerei.readWords(ArraySpielerei.java:36)
at ArraySpielerei.main(ArraySpielerei.java:20)
 
Ich habe das ganze mal mit einer Arraycopy gemacht , das scheint zu funktionieren :

Java:
public class Test{

	public static void main(String[] args){
		
		Scanner sc = new Scanner(System.in);
		
		System.out.println("Länge des ersten Arrays :");
		String[] input = new String[sc.nextInt()];
		
		System.out.println(input.length);

		String[] arr = readWords(input.length);
		
		String[] copy = Arrays.copyOf(arr, arr.length);
		
		String[] res = mergeWords(arr, copy);
		
		System.out.println(res.length);
		
		for (int i = 0; i < res.length; i++) {
			System.out.println(res[i]);
		}
		
	}
	
	public static String[] readWords(int sizeOfArray) {
		Scanner scanner = new Scanner(System.in);
		String[] array = new String[sizeOfArray];
		for (int i = 0; i < sizeOfArray; i++) {
			System.out.println("Bitte geben Sie " + (i + 1) + ". Wort ein: ");
			String words = scanner.nextLine();
			array[i] = words;
		}
		scanner.close();
		return array;
 
	}
	
	public static String[] mergeWords(String[] words, String[] words2) {
		String[] mergedWords = new String[words.length + words2.length];
		int n = 0;
		for (int i = 0; i < mergedWords.length; i++) {
			if (i < words.length) {
				mergedWords[i] = words[i];
			} else {
				mergedWords[i] = words2[n];
				n++;
			}
		}
		return mergedWords;
	}
}

Der fehler lässt sich also auf die eingabe des 2ten arrays eingrenzen.
 
Zuletzt bearbeitet:
Danke. Ich sollte ja das mit zwei Arrays machen und es soll ja nicht kopiert werden. Es sollen zwei Arrays sein, die durch den Benutzer gefüllt werden sollen.
 
Es ging auch erstmal nur darum einzugrenzen wo genau der Fehler liegt und warum eine NSE Exception fliegt, was sagt der Debugger ?
 
Wie erwartet liegt es also an einer deiner Methoden, wenn du den Scanner schlließt ist klar das dann nicht nochmal neu eingelesen werden kann ^^, ich hatte es mir allerdings auch nicht näher angeschaut aber joose hat ja den entscheidenden hinweis gegeben 🙂

EDIT : Deswegen funktionierte es auch mit einer Kopie des Arrays 😉
 
Zuletzt bearbeitet:
Du solltest dennoch noch aus der main-Methode das Erzeugen der Arrays entfernen.
Die Arrays werden in readWords erzeugt.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben