Median berechnen

Lennardt

Mitglied
Hallo Forum,

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

Code:
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?

Java:
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

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

genau da
Java:
 for(int i = 0; i <= anzahlElemente; i++) {
      try{
        Werte[i] = Double.valueOf(stWerte[i]);
      }
und zwar weil es heißen muss:
Java:
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
 
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.

Java:
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:

Code:
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)
 
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
 
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ß
 
Hallo,

nein, da sind keine Array Zugriffe!

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

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.
 
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?
 
Zuletzt bearbeitet:
ich denke henpara hat das ganz gut geschrieben und man sollte nicht wegen jeder kleinigkeit fragen sondern selbst mal überlegen!!

Code:
Exception in thread "AWT-EventQueue-1" java.lang.ArrayIndexOutOfBoundsException: 10
könte ja vielleicht etwas mit der länge des arrays zu tun haben?!
 
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:
 
Hallo,

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

Java:
    // 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!
 

Zurück
Oben