Nullpointerexception bei select Programm

bRainLaG

Mitglied
Hallo ich habe folgenden Code:
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Quickselect;

import java.util.Random;

/**
 *
 * @author ich
 */
public class Quickselect2 {

    private int[] array;
    private int numb;
    private int [] low;
    private int [] middle;
    private int [] high;

    public void select(int[] values, int k) {
        if (values == null || values.length == 0) {
            return;
        }
        this.array = values;
        numb = values.length;
        quickselect(array,k);
    }

    private int quickselect(int[] array, int k) {
        Random rnd = new Random();
        int a = rnd.nextInt(array.length-1);
        int j = 0;
        int l = 0;
        int m = 0;

        for(int i=0; i<=array.length; i++){
             if (array[i] < a){
                 low[j] = array[i];
                 j++;
             }
             else if (array[i] > a){
                 high[l] = array[i];
                 l++;
             }
             else {
                 middle[m] = array[i];
                 m++;
             }
        }

        if (k <= low.length-1){
            return quickselect(low,k);
        }
        else if(k >= low.length-1 + middle.length){
             return quickselect(high,k);
        }
        else return a;
    }

    public void random(int [] array){

        for(int k=0; k<array.length; k++){
            Random r =new Random();
            int rand  = r.nextInt();
            array[k] = rand;

        }

    }

public static void main(String[] args) {
        int k = 3;
        int [] array;
        array = new int [10];


        Quickselect2 quick = new Quickselect2();
        quick.random(array);
        quick.select(array,k);
       
        

     }

}

Das Program berechnet rekursiv, das k-größte Element. Nun bekomme ich, wenn ich mein Array in die drei Teilarrays aufspalte eine Nullpointerexception zurückgeworfen und ich verstehe nicht so ganz wieso. Ich hoffe mir kann da vieleicht jemand helfen:

Code:
Exception in thread "main" java.lang.NullPointerException
        at Quickselect.Quickselect2.quickselect(Quickselect2.java:39)
        at Quickselect.Quickselect2.select(Quickselect2.java:27)
        at Quickselect.Quickselect2.main(Quickselect2.java:80)
Java Result: 1
 
Hi.

Du solltest in der random Funktion nur 1 Random Objekt kreieren (vor der Schleife) nicht ständig in der Schleife.

Bitte stelle das nächste Mal sicher, dass die Zeilenangaben auch zu deinem Code passen.

Dein Fehler: die Arrays low, middle, high sind nicht initialisiert, also null.

Gruß
 
1. Schreibe ich die Erzeugung des Random Objekts außerhalb der rekursiven Funktion produziert er bei mir dort nur Fehler

2. Ich habe es auch schon gesucht aber wie initialisiere ich schlau ein Array dessen Größe ich vorher nicht genau sagen kann.

3. Produzier ich bei random wenn ich meine Arrays mit Testwerten initialisiere folgenden Fehler
Code:
Exception in thread "main" java.lang.StackOverflowError
        at java.lang.Number.<init>(Number.java:32)
        at java.util.concurrent.atomic.AtomicLong.<init>(AtomicLong.java:59)
        at java.util.Random.<init>(Random.java:79)
        at java.util.Random.<init>(Random.java:62)
Ich habe mir zu Random auch die Javadoc durchgelesen und theoretisch müsste ich so einen Wert aus dem Array randommäßig zuweisen können
 
Hi,

zu 1.
Das Random-Object kannst du natürlich außen hinschreiben. Das machst schon Sinn, damit nicht bei jedem Durchlauf ein neues Object erzeugt werden muss.
Java:
private Random rnd = new Random();
private int[] array;
private int numb;
private int [] low;
private int [] middle;
private int [] high;

zu 2.
Wenn du nicht weißt, wie groß ein Array wird, ist es am sinnvollsten eine List<Integer> zu verwenden. Diese List<Integer> kannst du, wenn alle Werte ermittelt sind, wieder in ein Array umwandeln.
Java:
int[] array = list.toArray(new int[list.size()]);

zu 3.
Das wird wahrscheinlich deshalb eine StackOverflowError-Exception geschmissen, weil - wie bei 1. schon erklärt - bei jedem Durchlauf ein Random-Object erzeugt und im Speicher gehalten wird.

Gruß

Fabio
 
Zurück