Hallo Leute.
Es geht um folgenden Code:
In Zeile 70 bekomm ich nen StackOverflowError.
Habe leider keine Ahnung warum.
Der erste Aufruf von quicksort scheint ja zu funktionieren (sonst würde ich ja garnicht zu Zeile 70 kommen)
Alles was vorher geschieht, scheint so zu funktionieren, wie es soll.
Die Ausgabe bis zum Fehler:
Ich hoffe ihr könnt mir helfen.
THX!
Es geht um folgenden Code:
Java:
import java.io.*;
import java.util.*;
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/*
* Messdatenerfassung.java
*
* Created on 27.09.2011, 10:23:28
*/
/**
*
* @author Marvin Fischenich
*/
public class Messdatenerfassung extends javax.swing.JFrame {
ArrayList<String> values = new ArrayList<String>();
ArrayList<Double> values_d = new ArrayList<Double>();
private double[] numbers;
private int number;
/** Creates new form Messdatenerfassung */
public Messdatenerfassung() {
initComponents();
}
public void inArrayKopieren() {
System.out.println("Array ausgeben:");
double[] numbers = new double[values_d.size()];
for(int i = 0; i < values_d.size(); i++) {
numbers[i] = values_d.get(i);
System.out.println(numbers[i]);
}
sort(numbers);
}
public void sort(double[] values) {
if(values == null || values.length == 0) {
return;
}
this.numbers = values;
number = values.length;
quicksort(0, number - 1);
}
private void quicksort(int low, int high) {
int i = low, j = high;
double pivot = numbers[low + ((high-low)/2)];
while(i <= j) {
while(numbers[i] < pivot) {
i++;
}
while(numbers[j] > pivot) {
j--;
}
if(i <= j) {
exchange(i, j);
i++;
j++;
}
}
if(low < j) {
quicksort(low, j);
}
if(i < high) {
quicksort(i, high);
}
}
private void exchange(int i, int j) {
double tmp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = tmp;
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jFileChooser1 = new javax.swing.JFileChooser();
textAnzahlMesswerte = new javax.swing.JLabel();
textFeldAnzahlMesswerte = new javax.swing.JTextField();
textMinimum = new javax.swing.JLabel();
textFeldMinimum = new javax.swing.JTextField();
textMaximum = new javax.swing.JLabel();
textFeldMaximum = new javax.swing.JTextField();
textMittelwert = new javax.swing.JLabel();
textFeldMittelwert = new javax.swing.JTextField();
textStandardabweichung = new javax.swing.JLabel();
textFeldStandardabweichung = new javax.swing.JTextField();
textMedian = new javax.swing.JLabel();
textFeldMedian = new javax.swing.JTextField();
buttonDatenLaden = new javax.swing.JButton();
buttonSortieren = new javax.swing.JButton();
tabelle = new javax.swing.JScrollPane();
jTable = new javax.swing.JTable();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Bobs Discount");
setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
textAnzahlMesswerte.setText("Anzahl Messwerte");
textFeldAnzahlMesswerte.setEditable(false);
textFeldAnzahlMesswerte.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
textFeldAnzahlMesswerteActionPerformed(evt);
}
});
textMinimum.setText("Minimum");
textFeldMinimum.setEditable(false);
textMaximum.setText("Maximum");
textFeldMaximum.setEditable(false);
textMittelwert.setText("Mittelwert");
textFeldMittelwert.setEditable(false);
textStandardabweichung.setText("Standardabweichung");
textFeldStandardabweichung.setEditable(false);
textMedian.setText("Median");
textFeldMedian.setEditable(false);
buttonDatenLaden.setText("Daten laden");
buttonDatenLaden.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
buttonDatenLadenActionPerformed(evt);
}
});
buttonSortieren.setText("Sortieren");
buttonSortieren.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
buttonSortierenActionPerformed(evt);
}
});
tabelle.setEnabled(false);
jTable.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null, null, null, null},
{null, null, null, null, null},
{null, null, null, null, null},
{null, null, null, null, null}
},
new String [] {
"1", "2", "3", "4", "5"
}
));
tabelle.setViewportView(jTable);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(textAnzahlMesswerte, javax.swing.GroupLayout.PREFERRED_SIZE, 204, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(textFeldAnzahlMesswerte, javax.swing.GroupLayout.PREFERRED_SIZE, 204, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addComponent(textMinimum, javax.swing.GroupLayout.PREFERRED_SIZE, 204, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(textFeldMinimum, javax.swing.GroupLayout.PREFERRED_SIZE, 204, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addComponent(textMaximum, javax.swing.GroupLayout.PREFERRED_SIZE, 204, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(textFeldMaximum, javax.swing.GroupLayout.PREFERRED_SIZE, 204, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addComponent(textMittelwert, javax.swing.GroupLayout.PREFERRED_SIZE, 204, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(textFeldMittelwert, javax.swing.GroupLayout.PREFERRED_SIZE, 204, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addComponent(textStandardabweichung, javax.swing.GroupLayout.PREFERRED_SIZE, 204, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(textFeldStandardabweichung, javax.swing.GroupLayout.PREFERRED_SIZE, 204, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addComponent(textMedian, javax.swing.GroupLayout.PREFERRED_SIZE, 204, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(textFeldMedian, javax.swing.GroupLayout.PREFERRED_SIZE, 204, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addComponent(buttonDatenLaden, javax.swing.GroupLayout.PREFERRED_SIZE, 204, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(buttonSortieren, javax.swing.GroupLayout.PREFERRED_SIZE, 204, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap()
.addComponent(tabelle, javax.swing.GroupLayout.DEFAULT_SIZE, 398, Short.MAX_VALUE)))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(3, 3, 3)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(textAnzahlMesswerte, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(textFeldAnzahlMesswerte, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(textMinimum, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(textFeldMinimum, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(textMaximum, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(textFeldMaximum, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(textMittelwert, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(textFeldMittelwert, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(textStandardabweichung, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(textFeldStandardabweichung, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(textMedian, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(textFeldMedian, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(buttonDatenLaden, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(buttonSortieren, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(tabelle, javax.swing.GroupLayout.PREFERRED_SIZE, 139, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
textAnzahlMesswerte.getAccessibleContext().setAccessibleDescription("");
pack();
}// </editor-fold>
private void textFeldAnzahlMesswerteActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
}
private void buttonDatenLadenActionPerformed(java.awt.event.ActionEvent evt) {
int option = jFileChooser1.showOpenDialog(this);
if(option == jFileChooser1.APPROVE_OPTION) {
BufferedReader reader;
try {
reader = new BufferedReader(new FileReader(jFileChooser1.getSelectedFile().getAbsolutePath()));
String zeile;
while ((zeile = reader.readLine()) != null) {
values.add(zeile);
}
} catch (IOException e) {
System.err.println("Datei konnte nicht eingelesen werden!");
}
} else if(option == jFileChooser1.CANCEL_OPTION) {
} else if(option == jFileChooser1.ERROR_OPTION) {
System.err.println("Datei konnte nicht eingelesen werden!");
}
for(int i = 0; i < values.size(); i++) {
values_d.add(Double.parseDouble(values.get(i)));
}
}
private void buttonSortierenActionPerformed(java.awt.event.ActionEvent evt) {
inArrayKopieren();
System.out.println("Sortiertes Array:");
for(int i = 0; i < numbers.length; i++) {
System.out.println(numbers[i]);
}
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Messdatenerfassung().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton buttonDatenLaden;
private javax.swing.JButton buttonSortieren;
private javax.swing.JFileChooser jFileChooser1;
private javax.swing.JTable jTable;
private javax.swing.JScrollPane tabelle;
private javax.swing.JLabel textAnzahlMesswerte;
private javax.swing.JTextField textFeldAnzahlMesswerte;
private javax.swing.JTextField textFeldMaximum;
private javax.swing.JTextField textFeldMedian;
private javax.swing.JTextField textFeldMinimum;
private javax.swing.JTextField textFeldMittelwert;
private javax.swing.JTextField textFeldStandardabweichung;
private javax.swing.JLabel textMaximum;
private javax.swing.JLabel textMedian;
private javax.swing.JLabel textMinimum;
private javax.swing.JLabel textMittelwert;
private javax.swing.JLabel textStandardabweichung;
// End of variables declaration
}
In Zeile 70 bekomm ich nen StackOverflowError.
Habe leider keine Ahnung warum.
Der erste Aufruf von quicksort scheint ja zu funktionieren (sonst würde ich ja garnicht zu Zeile 70 kommen)
Alles was vorher geschieht, scheint so zu funktionieren, wie es soll.
Die Ausgabe bis zum Fehler:
Code:
Array ausgeben:
3.78
3.88
3.78
3.82
3.75
3.83
Ich hoffe ihr könnt mir helfen.
THX!