Bubblesort: Exception in Thread "main"

  • Themenstarter Themenstarter Lumina
  • Beginndatum Beginndatum
L

Lumina

Gast
Hallo, ich bin Medieninformatik Studentin im ersten Semester und soll zur Übung
eine Bubblesort Funktion schreiben. Das Problem ist, wenn ich das Programm laufen lasse kommt immer die Meldung "Exception in Thread "main" java.lang.ArrayIndexOutOfBoundsException: 12"
Ich hoffe mir kann jemand weiterhelfen
Gemeckert wird über die Zeile 24 und 53
Hier mein Code:

[JAVA=2]class Bubble
{
private int[] array;
int vertauschentemp=1;
int vertauschen=0;

//Konstruktor
public Bubble(int[]array)
{
this.array=array;
}

//Sortiermethode
public int[] sort()
{
do
{
vertauschentemp=vertauschen;
for(int i=0;i<array.length;i++)
{
for(int j=i;j<=array.length;j++)
{
if(array>array[j])
{
int wert=array;
array=array[j];
array[j]=wert;
vertauschen++;
}
}
}
}
while(vertauschentemp==vertauschen);
return array;
}

//Ausgabe
public void print()
{
for(int i=0;i<array.length;i++)
{
System.out.println(array);
}
}
}
public class Bubblesort
{
public static void main(String[]args)
{
int[] feld={44,30,24,55,68,1,211,95,2,12,12,13};
Bubble zahlen=new Bubble(feld);
zahlen.sort();
zahlen.print();
}
}[/code]
 
Ein Array der Länge n beginnt mit Index 0 und endet bei n-1. Also muss in Zeile 23 statt
Code:
j<=array.length
ein
Code:
j<array.length
stehen.
 
Wie mein Vorposter schon erwähnt hat ist array[array.length] das erste nicht existierende Element und wirft somit ein Fehler.

java.lang.ArrayIndexOutOfBoundsException wird Dir in deiner Laufbahn sicherlich noch etliche male über den Weg laufen, dann immer nach den Arrayabfragen schauen irgendwo wird dann auf ein nicht existierendes Element zugegriffen.

Dies geschieht in Zeile 23.
Und da eine Methode wenn sie aufgerufen wird (Zeile 53) in der ein Fehler ist diesen weitergeworfen bekommt ist auch dort ein Fehler (der auch weg ist wenn Du Zeile 23 änderst)

Java:
         for(int i=0;i<array.length;i++)
         {
            for(int j=i;j<array.length;j++) // < 
            {
               if(array[i]>array[j])
               {
                  int wert=array[i];
                  array[i]=array[j];
                  array[j]=wert;
                  vertauschen++;
               }
            }
 
zum selber denken:
vor der Zeile mit der Exception
System.out.println(i .. j .. Länge des Arrays)
->
spätestens dann erkennen dass ein Index zu hoch ist, obwohl es die Fehlermeldung auch sag
->
und dann überlegen, woher diese offensichtlich sinnlose Indexe kommen, irgendwer muss ja verantwortlich sein
 
Hm,

scheint mir ein wenig "unstrukturiert" und unnötig kompliziert (nicht böse gemeint, Du lernst ja noch).

Ich habs mal schnell runtergeschrieben, wie ich es am einfachsten finde (wobei da Dein Prof sicher meckern würde, dass es nicht der Java-OO Stil ist, aber das war ja nicht gefordert in Deiner Aufgabenstellung 😉):

Java:
package bubblesort;

public class BubbleSort {

	public static void main(String[] args) {
		
		int[] arrayToSort = {5, 9, 2, 22, 41, 4, 6, 1, 23, 7, 19, 0};
		int tmp;
		
		output(arrayToSort, "unsorted");
		
		while(!isSorted(arrayToSort)) {
			for(int i = 0; i < arrayToSort.length - 1; i++) {
				if(arrayToSort[i] > arrayToSort[i + 1]) {
					tmp = arrayToSort[i];
					arrayToSort[i] = arrayToSort[i + 1];
					arrayToSort[i + 1] = tmp;
				}
			}			
		}
		
		output(arrayToSort, "sorted");
		
	}
	
	
	public static boolean isSorted(int[] arrayToSort) {
		for(int j = 0; j < arrayToSort.length - 1; j++) {
			if(arrayToSort[j] > arrayToSort[j + 1]) {
				return false;
			}
		}
		return true;
	}
	
	
	public static void output(int[] outputArray, String status) {
		System.out.print(status + ": ");
		for(int k = 0; k < outputArray.length; k++) {
			System.out.print(outputArray[k] + ",");			
		}
		System.out.println();
	}

}


MfG

ne0h
 
Edit zur output()-Methode:

Habs bisschen schöner gemacht, damit nach der letzten Zahl kein Komma mehr steht (wir wollens ja wenn dann auch vernünftig schön machen 😀)

Java:
	public static void output(int[] outputArray, String status) {
		System.out.print(status + ": ");
		for(int k = 0; k < outputArray.length; k++) {
			String outline = (k + 1 == outputArray.length) ? "" : ",";
			System.out.print(outputArray[k] + outline);			
		}
		System.out.println();
	}
 

Neue Themen


Zurück
Oben