Arrays in Funktion Kopieren und Bearbeiten

Guten Morgen.
Ich möchte leere Arrays in einer Funktion Daten zuweisen.
Kleiner Beispielcode: (weis nicht wie ich den Code hier formatiere)
Java:
class MyArrayeditor{
   int[] leeresArray1;
   int[] leeresArray2;
   public MyArrayeditor(int[] vollesArray){
      copyandchange(vollesArray, leeresArray1);//<--Funktioniert wunderbar
      copyandchange(leeresArray1, leeresArray2);//<-- Funktioniert nicht. NullPointerExeption grund hierfür ist der input.length aufruf
   }

   public void copyandchange(int[] input, int[] output){
      int[] internArray = new int[input.lenght];
      ...Bearbeitung der Daten...
      output = internArray.copy()
  }
}
Leider bekomme Ich beim zweiten aufruf meine copy Funktion eine NullPointerExeption.
Wo ist mein Denkfehler?
 
Zuletzt bearbeitet von einem Moderator:
Ahh jetz weis ich wies mim Code geht :D
Hier die Originalfunktion


Code:
    private void apply_kernel (int[] input, int[]output, int[]filter) {
        
        int filter_radius = (filter.length-1)/2;
        System.out.println(filter_radius);
        System.out.println(input.length);
        int[] intern = new int[input.length-2*filter_radius];
        //Druchläuft X Coordianten
        for(int x = filter_radius; x<input.length-filter_radius;x++) {
            //Druchläuft Filter
            int filtersumme = 0;
            int filtergroesse = 0;
            for(int i = 0;i< filter.length;i++) {
                int produkt = input[x-filter_radius+i]*filter[i];
                filtersumme= filtersumme+produkt;
                filtergroesse = filtergroesse + filter[i];       
            }
            //Bei Ableitungsfiltern ist das ergebnis 0, jedoch kann nicht durch 0 geteilt werden
            if(filtergroesse == 0) {
                filtergroesse =1;
            }
            filtersumme = filtersumme/filtergroesse;
            intern[x-filter_radius]=filtersumme;
            
        }
        output=intern.clone();
    }
 
Also das dürfte weiterhin nicht funktionieren.
In Java sind alle Aufrufe reine "Value" Aufrufe. Eine Zuweisung zu einem Parameter wird außerhalb nicht mitbekommen.

Also schnell ein übersichtlicher, kleiner Test:
Java:
public class Test {
  public static void arrayTest(int[] output) {
    output = new int[10];
    System.out.println("Länge in Methode: " + output.length);
  }

  public static void main(String[] args) {
    int[] output = new int[5];
    System.out.println("Länge vor Aufruf: " + output.length);
    arrayTest(output);
    System.out.println("Länge nach Aufruf: " + output.length);
  }
}
Ausgabe ist natürlich:
Länge vor Aufruf: 5
Länge in Methode: 10
Länge nach Aufruf: 5

Daher mein Tipp: mach immer alle Parameter final - dann rennst Du nicht in so ein Problem:
Code:
public static void arrayTest(final int[] output) {
Und schon kommt beim Übersetzen ein Fehler:

Test.java:3: error: final parameter output may not be assigned
output = new int[10];
^
1 error

Was natürlich geht, ist die Zuweisung von Werten in das Array. Also wenn Du das output Array schon vorher erzeugt hast, dann könntest Du da Elemente rein kopieren. Das liegt daran, dass da kein Array an sich übergeben wird, sondern eine Referenz. Also sozusagen ein Zettel, auf dem steht, wo die Wert zu finden sind. Also z.B. bildlich gesprochen: Wo sind die Kartons? Dann kannst Du die Kartons befüllen und alles ist ok. Aber neue Kartons erstellen und dann den Ort der Kartons auf dem Zettel zu verändern, bringt nichts, denn bei Methodenaufruf wird der Zettel geschrieben und dann am Ende weggeworfen.

Somit ist dein output=intern.clone(); ohne jede Wirkung.
 
private void apply_kernel (int[] input, int[]output, int[]filter) {
In dem Falle weil Java ja "Call-by-value" ist solltest du den Output zurück liefern: private int[] apply_kernel(int[] input, int[] filter) { ... }

Oder eben gleich in das output Array schreiben und gleich mit der richtigen Größe (input.length-2*filter_radius) initialisieren.
 
In dem Falle weil Java ja "Call-by-value" ist solltest du den Output zurück liefern: private int[] apply_kernel(int[] input, int[] filter) { ... }

Oder eben gleich in das output Array schreiben und gleich mit der richtigen Größe (input.length-2*filter_radius) initialisieren.

Danke, habs jetzt mit return int[]. Klappt super. Merci
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben