ArrayIndexOutOfBoundsException - Problem mit Array-Größe

The_Virus

Mitglied
Ich habe für die Uni ein Programm geschrieben, was einen eingelesenen Satz in ein Histogramm umwandelt. Die Schwierigkeit dabei ist, es können beliebig viele Leerzeichen vor dem ersten Wort und zwischen den Wörtern stehen. Auch soll das Histogramm immer genau unter dem ersten Buchstaben des jeweiligen Wort ausgegeben werden. Es geht um diese Aufgabe:
Übungsblatt "Arrays"

An sich fertig ist das Programm fertig und funktioniert so wie es soll, aber nur solange vor dem ersten Wort keine Leerzeichen stehen. Sobald ich da ein Leerzeichen davor schreibe, kriege ich ArrayIndexOutOfBoundsException.
Vielleicht kann einer von euch das mal kurz testen und mir sagen wo der Fehler ist. Ich finde ihn nämlich nicht.
Bsp - so gehts:
Code:
heute    regnet es     morgen   vielleicht  auch
so kriege ich den Error:
Code:
   heute    regnet es     morgen   vielleicht  auch

Java:
package paketHistrogram;
import java.util.Scanner;

public class Histogram {
	private String satz;
	private String[] wort;
	private String[] leerZ;
	private int wortLeerZ;
	private int maxLang;
	private String zeile;
	private String weiter;
	
	public void einlesen() {
		Scanner einlesen = new Scanner(System.in);
		System.out.println("Bitte geben Sie einen Satz ein!");
		satz = einlesen.nextLine();
		wort = satz.split("\\s+");
		leerZ = satz.split("\\w+");
		
//Dieser Teil ist nur zur Ueberpruefung
//		for (int i = 0; i < leerZ.length; i++) {
//			System.out.printf("ArrayLeerZ[%d]: |%s| \n", i, leerZ[i]);
//		}
	}
	
	public void leerzPlusWortlaenge() {
		for (int i = 1; i < leerZ.length; i++) {
			wortLeerZ = (wort[i-1].length() -1);
			for(int j = 0; j < wortLeerZ; j++) {
				leerZ[i] += " ";
			}
		}
	}
	
	public void maxWortLaenge() {
		maxLang = 0;
		for (int i = 0; i < wort.length; i++) {
			if(wort[i].length() > maxLang) {
				maxLang = wort[i].length();
			}
		}
	}

	public void ausgabe() {
		for (int spalte = 0; spalte < maxLang; spalte++){
			zeile = "";
			for (int i = 0; i < wort.length; i++){
				if (wort[i].length() <= spalte){
					zeile += (leerZ[i] + "-");
				}else{
					zeile += (leerZ[i] + "*");
				}
			}
			System.out.println(zeile);	
		}
		
//Dieser Teil ist nur zur Ueberpruefung
//		System.out.println();
//		for (int h = 0; h < wort.length; h++) {
//			System.out.printf("ArrayWort[%d]: |%s| \n", h, wort[h]);
//		}
//		System.out.println();
//		for (int i = 0; i < leerZ.length; i++) {
//			System.out.printf("ArrayLeerZ[%d]: |%s| \n", i, leerZ[i]);
//		}
//		System.out.printf("\nMax Laenge: %d\n\n", maxLang);
	}
	
	public void weiter() {
		Scanner einlesen = new Scanner(System.in);
		System.out.println("\nNochmal? (j / n)");
		weiter = einlesen.next();
		if(weiter.equals("n")) {
			System.out.println("Schoenen Tag noch!");
		}
	}
	
	public String getWeiter() {
		return weiter;
	}	
}
hier noch die main() dazu:
Java:
package paketHistrogram;
public class HistogramStart {
	public static void main(String[] args) {
		
		Histogram histo = new Histogram();
		do {
			histo.einlesen();
			histo.leerzPlusWortlaenge();
			histo.maxWortLaenge();
			histo.ausgabe();
			histo.weiter();
		} while( histo.getWeiter().equals("j") );
	}
}
 
Zuletzt bearbeitet:
Java:
 if (wort[i].length() <= spalte){
                    zeile += (leerZ[i] + "-");

bin mal mit dem debugger durch. Im fehlerhaften Fall hast du 7 Woerter, und 6 leerZ greifst aber mit dem gleichen Index i drauf zu. Deswegen gibt den Fehler.
Kannst du führende Leerzeichen nicht einfach beim einlesen abschneiden (String.trim(), String.LTrim, String.RTrim) oder sind die für die Aufgabe relevant? Hab mir die Aufgabenstellung ehrlich gesagt nicht angeschaut. 😳
 
Ja, ich brauche die führenden Leerzeichen, um die *-Ausgabe einzurücken.
Das Problem sind aber nicht die Leerzeichen, sondern das Wort Array. Es sind in jedem Fall ja nur 6 Wörter, nicht 7. Aber schreibt aber ins Wort-Array an der ersten Stelle eine ein "" (Leer).

Wie kann ich diese Leerstelle rauslöschen und die Stellen dahinter eins aufrücken lassen?
 
Zuletzt bearbeitet:
die Methode [c]trim()[/c] der Klasse String bietet das entfernen von Leerzeichen zu Beginn und am Ende des Strings an und liefert einen String zurück
 

Zurück
Oben