# Median berechnen



## Lennardt (10. Dez 2010)

Hallo Forum,

ich verzweifel einfach an der Lösung dieses Fehlers. Die Java Konsole sagt folgendes:


```
Exception in thread "AWT-EventQueue-1" java.lang.ArrayIndexOutOfBoundsException: 5
	at Median.btBerechnen_ActionPerformed(Median.java:56)
	at Median$1.actionPerformed(Median.java:25)
	at java.awt.Button.processActionEvent(Button.java:392)
	at java.awt.Button.processEvent(Button.java:360)
	at java.awt.Component.dispatchEventImpl(Component.java:4630)
	at java.awt.Component.dispatchEvent(Component.java:4460)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
```

Was muss ich ändern?


```
import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;

public class Median extends Applet {
  // Anfang Attribute
  private TextArea taWerte = new TextArea("", 1, 1, TextArea.SCROLLBARS_NONE);
  private Button btBerechnen = new Button();
  private Label lbErgebnis = new Label();
  // Ende Attribute

  public void init() {
    Panel cp = new Panel(null);
    cp.setBounds(0, 0, 456, 190);
    add(cp);
    // Anfang Komponenten

    taWerte.setBounds(8, 8, 433, 89);
    taWerte.setText("");
    cp.add(taWerte);
    btBerechnen.setBounds(8, 104, 435, 25);
  btBerechnen.setLabel("Median berechnen");
    btBerechnen.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        btBerechnen_ActionPerformed(evt);
      }
    });
    cp.add(btBerechnen);
  lbErgebnis.setBounds(8, 136, 429, 16);
    lbErgebnis.setText("");
    lbErgebnis.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
  lbErgebnis.setAlignment(Label.CENTER);
    cp.add(lbErgebnis);
    // Ende Komponenten

  }
  // Anfang Methoden
  public void btBerechnen_ActionPerformed(ActionEvent evt) {
    String eingabe = taWerte.getText();
    // Kommata durch Punkte ersetzten
    eingabe = eingabe.replace(",",".");
    int eingabeLaenge = eingabe.length();
    int anzahlElemente;
    double median;
    
    // String aus dem TF an Leerzeichen trennen und Elemente in AR
    String stWerte[] = eingabe.split(" ");

    // Elemente im String AR zählen, um Größe des Double AR zu erhalten
    anzahlElemente = stWerte.length;
    double Werte[] = new double[anzahlElemente];
    
    // Elemente aus dem String AR in den Double AR kopieren mit Fehlerbehandlung
    for(int i = 0; i <= anzahlElemente; i++) {
      try{
        Werte[i] = Double.valueOf(stWerte[i]);
      }
      catch(NumberFormatException e) {
        lbErgebnis.setText("Bitte geben Sie nur Zahlen getrennt von Leerzeichen ein.");
      }
    }

    // Array sortieren
    sortiere(Werte);

    // Hat der Array eine ungerade oder gerade Länge
    if(anzahlElemente % 2 == 0) {
      // Gerade
      double dbAnzahlElemente = (double) anzahlElemente;
      double dbhaelfteminuseins = dbAnzahlElemente - 0.5;
      double dbhaelftepluseins = dbAnzahlElemente + 0.5;
      int haelfteminuseins = (int) dbhaelfteminuseins;
      int haelftepluseins = (int) dbhaelftepluseins;
      
      median = (Werte[haelfteminuseins] +  Werte[haelftepluseins]) / 2;
    } else {
      // Ungerade
      median = Werte[anzahlElemente / 2];
    }

    // Double in String umwandeln, um in das LB schreiben zu können
    String sMedian = String.valueOf(median);
    
    lbErgebnis.setText("Der Median beträgt " + sMedian);
  }
  
  public void sortiere(double[] unsortierteWerte) {

  }
  // Ende Methoden

}
```


----------



## nrg (10. Dez 2010)

for(int i = 0; i < anzahlElemente; i++) {


----------



## henpara (10. Dez 2010)

> at Median$1.actionPerformed(Median.java:56)



genau da

```
for(int i = 0; i <= anzahlElemente; i++) {
      try{
        Werte[i] = Double.valueOf(stWerte[i]);
      }
```
und zwar weil es heißen muss:

```
for(int i = 0; i < anzahlElemente; i++) {
      try{
        Werte[i] = Double.valueOf(stWerte[i]);
      }
```

sollte deinen fehler beheben (Arrays fangen bei 0 an zu zählen und gehen folglich nur bis "länge-1".

mfg


----------



## Lennardt (10. Dez 2010)

Oh man, vielen Dank ihr beiden! ;-)


----------



## Lennardt (10. Dez 2010)

Irgendwas läuft immer noch schief. Manchmal klappt die Berechnung fehlerlos, aber manchmal werden auch Fehler ausgegeben. Beispielsweise wenn ich "1 2 3 4 5 6 7 8 9 10" eingebe. "1 2 3 4 5 6 7 8 9" klappt jedoch tadellos. Hinzugekommen ist neben Euer Änderung der Bubblesort Algorithmus. 


```
import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;

public class Median extends Applet {
  // Anfang Attribute
  private TextArea taWerte = new TextArea("", 1, 1, TextArea.SCROLLBARS_NONE);
  private Button btBerechnen = new Button();
  private Label lbErgebnis = new Label();
  // Ende Attribute

  public void init() {
    Panel cp = new Panel(null);
    cp.setBounds(0, 0, 456, 190);
    add(cp);
    // Anfang Komponenten

    taWerte.setBounds(8, 8, 433, 89);
    taWerte.setText("");
    cp.add(taWerte);
    btBerechnen.setBounds(8, 104, 435, 25);
  btBerechnen.setLabel("Median berechnen");
    btBerechnen.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        btBerechnen_ActionPerformed(evt);
      }
    });
    cp.add(btBerechnen);
  lbErgebnis.setBounds(8, 136, 429, 16);
    lbErgebnis.setText("");
    lbErgebnis.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
  lbErgebnis.setAlignment(Label.CENTER);
    cp.add(lbErgebnis);
    // Ende Komponenten

  }
  // Anfang Methoden
  public void btBerechnen_ActionPerformed(ActionEvent evt) {
    String eingabe = taWerte.getText();
    // Kommata durch Punkte ersetzten
    eingabe = eingabe.replace(",",".");
    int eingabeLaenge = eingabe.length();
    int anzahlElemente;
    double median;
    
    // String aus dem TF an Leerzeichen trennen und Elemente in AR
    String stWerte[] = eingabe.split(" ");

    // Elemente im String AR zählen, um Größe des Double AR zu erhalten
    anzahlElemente = stWerte.length;
    double Werte[] = new double[anzahlElemente];
    
    // Elemente aus dem String AR in den Double AR kopieren mit Fehlerbehandlung
    for(int i = 0; i < anzahlElemente; i++) {
      try{
        Werte[i] = Double.valueOf(stWerte[i]);
      }
      catch(NumberFormatException e) {
        lbErgebnis.setText("Bitte geben Sie nur Zahlen getrennt von Leerzeichen ein.");
      }
    }

    // Array sortieren
    sortiere(Werte);

    // Hat der Array eine ungerade oder gerade Länge
    if(anzahlElemente % 2 == 0) {
      // Gerade
      double dbAnzahlElemente = (double) anzahlElemente;
      double dbhaelfteminuseins = dbAnzahlElemente - 0.5;
      double dbhaelftepluseins = dbAnzahlElemente + 0.5;
      int haelfteminuseins = (int) dbhaelfteminuseins;
      int haelftepluseins = (int) dbhaelftepluseins;
      
      median = (Werte[haelfteminuseins] +  Werte[haelftepluseins]) / 2;
    } else {
      // Ungerade
      median = Werte[anzahlElemente / 2];
    }

    // Double in String umwandeln, um in das LB schreiben zu können
    String sMedian = String.valueOf(median);
    
    lbErgebnis.setText("Der Median beträgt " + sMedian);
  }
  
  public void sortiere(double[] x) {
    boolean unsortiert=true;
      double temp;

      while (unsortiert){
         unsortiert = false;
         for (int i=0; i < x.length-1; i++)
            if (x[i] > x[i+1]) {
               temp       = x[i];
               x[i]       = x[i+1];
               x[i+1]     = temp;
               unsortiert = true;
            }
      }
  }
  // Ende Methoden

}
```

Diese Fehlermeldung kommt:


```
Exception in thread "AWT-EventQueue-1" java.lang.ArrayIndexOutOfBoundsException: 10
	at Median.btBerechnen_ActionPerformed(Median.java:75)
	at Median$1.actionPerformed(Median.java:25)
	at java.awt.Button.processActionEvent(Button.java:392)
	at java.awt.Button.processEvent(Button.java:360)
	at java.awt.Component.dispatchEventImpl(Component.java:4630)
	at java.awt.Component.dispatchEvent(Component.java:4460)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
```


----------



## henpara (10. Dez 2010)

versuch doch erstmal selber dahinterzukommen, dei Fehlerart ist doch die gleiche wie eben. Auch die Zeile, in der der Fehler auftritt wird dir wieder angesagt (75). 

Also guckst du, was wird in Zeile 75 gemacht, sind da Array-zugriffe. Wenn ja, welche und wo könnte die Exception ausgelöst werden.

Zur noch mit dem debugger durchs Programm und Werte anschauen.

Hilft dir übrigens auch für die Zukunft nur bedingt, wenn du bei jedem kleinen Fehler im Forum nachfragst, vor allem, wenn du nicht selber wenigstens ein bischen Zeit damit verbracht hast, das ganze zu lösen.

mfg


----------



## Lennardt (10. Dez 2010)

Hallo,

nein, da sind keine Array Zugriffe! 

[JAVA=75]
      median = (Werte[haelfteminuseins] +  Werte[haelftepluseins]) / 2;
[/code]

Ich habe ein bisschen schulischen Zeitdruck mit dem Programm ;-) Und es hat mich schon eine Menge Ärger gekostet. Wäre nett, wenn du mir einfach ein bisschen direkter den Fehler nennen könntest. Was den ArrayIndexOutOfBounds Fehler auslöst kann ich nicht entdecken.

Gruß


----------



## Gast2 (10. Dez 2010)

Lennardt hat gesagt.:


> Hallo,
> 
> nein, da sind keine Array Zugriffe!
> 
> ...



Was ist die zitierte Zeile Code denn sonst für dich?
Du fragst den Array nach den gespeicherten Wert an dem Index haelfteminuseins und haelftepluseins. Der haelftepluseins wird wohl nicht vorhanden sein.


----------



## Lennardt (10. Dez 2010)

Oh shit. Wie gesagt, Zeitdruck. Macht konfus. Danke


----------



## henpara (10. Dez 2010)

> Ich habe ein bisschen schulischen Zeitdruck mit dem Programm



Das glaub ich dir gerne. Und ich kann dich beruhigen, es gibt sicher noch mehr Leute mit Zeitdruck.

Aber bedenke: Hier im Forum kann NIEMAND etwas dafür, daß du schulischen Zeitdruck hast.
Dafür bist DU ganz alleine verantwortlich.

@Problem:
mein Vorposter hat jetzt schon präzisiert, wo genau die Array-Zugriffe in der Zeile sind.

Das Forum ist dazu da, dir zu helfen, das tun wir. Wir sind aber nicht dazu da, Lösungen zu verschenken oder dir komplett deine Arbeit abzunehmen.

Kurz:
Problem lösen: DU
Ansätze/Hinweise bekommen: Forum.

Also schaust du dir jetzt die Zeile nochmal genau an, wo da auf das Array zugegriffen wird und überlegst dir, ob die Felder alle existieren (Der compiler sagt dir ja schon, daß mind. ein Feld nicht existiert)

und nicht vergessen:
Array[] a = new Array[5] hat werte von a[0] bis a[4]

edit: und zum thema zeitdruck: manchmal lieber 10min pause einlegen, durchatmen, wieder sammeln und dann weiterarbeiten. Dann kommt man idR schneller voran, als wenn man "mit zeitdruck"-Gefühl durcharbeitet und nix mehr rafft, weil einem alles zu Kopf steigt, oder wie du sagst man "konfus" wird.
Wir haben 15uhr, dann kommt Wochenende, woher kommt dein Zeitdruck? Bist du noch in der Schule oder was?


----------



## mariusbopp (10. Dez 2010)

ich denke henpara hat das ganz gut geschrieben und man sollte nicht wegen jeder kleinigkeit fragen sondern selbst mal überlegen!!


```
Exception in thread "AWT-EventQueue-1" java.lang.ArrayIndexOutOfBoundsException: 10
```
 könte ja vielleicht etwas mit der länge des arrays zu tun haben?!


----------



## Gast2 (10. Dez 2010)

Nicht nur vielleicht. (Wie schon in #8 und #10 erwähnt)


----------



## Lennardt (10. Dez 2010)

Stundenbeginn ist um 15:10 Uhr  Kann das Programm aber noch mal ganz in ruhe während der Stunde jetzt bearbeiten. Danke.


----------



## mariusbopp (10. Dez 2010)

okay vill kommst du dann auf selbst auf die fehler und wie gesagt fragen ist ja nicht verboten mach dir nur vorher mal selber gedanken drüber:toll:


----------



## Lennardt (10. Dez 2010)

Hallo,

ich habe die entsprechende Stelle im Quelltext wie folgt geändert: 


```
// Hat der Array eine ungerade oder gerade Länge
    if(anzahlElemente % 2 == 0) {
      // Gerade
      double dbAnzahlElemente = (double) anzahlElemente;
      double dbhaelfteminuseins = dbAnzahlElemente / 2 - 0.5;
      double dbhaelftepluseins = dbAnzahlElemente / 2 + 0.5;
      int haelfteminuseins = (int) dbhaelfteminuseins;
      int haelftepluseins = (int) dbhaelftepluseins;
      
      median = (Werte[haelfteminuseins] +  Werte[haelftepluseins]) / 2;
    } else {
      // Ungerade
      median = Werte[anzahlElemente / 2];
    }
```

Hoffe damit den Fehler beseitigt zu haben  Danke für eure Hilfe!


----------



## mariusbopp (10. Dez 2010)

mekert noch irgendwas?? oder lässt es sich ohne meldungen compilieren?!


----------



## Lennardt (10. Dez 2010)

Nein, jetzt ist alles schön :toll: 
Habe noch die minus und plus 0.5 in 1.0 geändert. So machts mehr Sinn. Danke für all die Hilfe!


----------



## mariusbopp (10. Dez 2010)

:applaus::applaus:

na also


----------

