# Array void Methode erstellen.



## Derenei (13. Jan 2012)

Hätte eine Frage habe bis jetzt Methoden mit Arrays mit: z.b private static int[] MaxMin ( []a) erstellt, diese hatten aber auch immer einen Rückgabewert. Wollte vorher dieses Methode mit Arrays mit void erstellen ohne Rückgabewert als ich Übersetzen gedrückt habe kamen immer nur Fehlermeldungen. Geht das überhaupt so wie ich mir das vorstelle und wenn wie?
Danke im Voraus.


----------



## faetzminator (13. Jan 2012)

Wie willst du etwas mit [c]void[/c] aufrufen? Wenn du kein Array hast, kannst du die Methode mit [c]null[/c] aufrufen. [c]void[/c] ist _nur_ ein - bzw. kein - Rückgabetyp.


----------



## Derenei (13. Jan 2012)

Sorry meinte nicht aufrufen sondern erstellen einer Methode ohne Rückgabewert mit Arrays.


----------



## pro2 (13. Jan 2012)

Hä?^^ Natürlich kannst du eine void Methode erstellen, die mit Arrays arbeitet. 


```
int deinArray[] = new int[20];
void  methodeOhneRückgabewertMitArrays(){
    System.out.println(deinArray[0]);
}
```

oder sowas. Ansonsten verstehe ich deine Frage nicht :S


----------



## faetzminator (13. Jan 2012)

Du kannst sogar das Array modifizieren, ohne dass du es zurückgeben musst:

```
public void doSdth(int[] array) {
    array[0] = 7;
}
```


----------



## hdi (13. Jan 2012)

Also um das nochmal zu betonen:



> Wollte vorher dieses Methode mit Arrays mit void erstellen ohne Rückgabewert als ich Übersetzen gedrückt habe kamen immer nur Fehlermeldungen.



Was auch immer das für Fehlermeldungen waren, sie kamen sicherlich nicht weil du ne void-Methode mit nem array hast. Ich kann mir vorstellen dass du zB den Rückgabetyp auf void geändert hast, aber vergessen hast das return-Statement zu entfernen (Eine Methode die void ist kann keinen Wert returnen -> Compile Error)


----------



## Derenei (13. Jan 2012)

Ich sollte euch mal meinen Quellcode zeigen dann versteht ihr das Problem besser:


```
/**
 * Beschreiben Sie hier die Klasse Array_HÜ.
 * 
 * @author (Ihr Name) 
 * @version (eine Versionsnummer oder ein Datum)
 */
public class Array_HÜ
{
    public static void main (String[]args)
    {
        Out.println ("Auswahl 1,Zwei Arrays zusammengehängt ausgeben.");
        Out.println ("Auswahl 2,Array a und Array b mischen und jeweils ein Element von Array a und ein Element von Array b ausgeben.");
        
        int auswahl;
        
        do
        {
            Out.print ("Treffen Sie ihre Auswahl (1/2)");
            auswahl = In.readInt ();
            
            switch (auswahl)
            {
                case 1:
                Out.print ("Geben Sie die Länge des ersten Arrays ein: ");
                int x = In.readInt ();
                int []a = new int [x];
                Out.print ("Geben Sie die Länge des zweiten Arrays ein: ");
                int x2 = In.readInt ();
                int []b = new int [x2];
        
                for (int i = 0; i < a.length; i++)
                {
                    Out.print ("Array a: ");
                    a[i] = In.readInt ();
                }
                for (int i = 0; i < b.length; i++)
                {
                    Out.print ("Array b: ");
                    b[i] = In.readInt ();
                }
            
                Out.print ("Array a: ");
                for (int i = 0; i <= a.length-1; i++)
                {
                    Out.print (a[i]+" ");
                }
                Out.println ();
                Out.print ("Array b: ");
                for (int i = 0; i <= b.length-1; i++)
                {
                    Out.print (b[i]+" ");
                }
                int [] c = appendArrays (a,b);
                Out.print ("Arrays zusammengehängt: ");
                Out.print (appendArrays (a,b));
                break;
                
                case 2:
                
            }
        }while(auswahl == 1 && auswahl == 2);
        
    }
    
    private static void[] appendArrays (int [] a, int [] b)//Hier liegt das Problem.
    {
        for (int i = 0; i <= a.length-1; i++)
                {
                    Out.print (a[i]);
                }
        for (int i = 0; i <= b.length-1; i++)
                {
                    Out.print (b[i]);
                }
    }
}
```
Mein Programm ist noch nicht fertig. 
Habe vorher bei der appendArrays Methode int statt void geschrieben und als return Wert habe null geschrieben.
Dabei wurde in der Konsole immer null ausgegeben und das passt noch nicht.
Ich habe das void einfach mal geschrieben damit ihr das Problem besser versteht, das void ist natürlich falsch ich weiß aber nicht was.
Vielleicht hätte wer von euch eine Idee, danke im Voraus.


----------



## faetzminator (13. Jan 2012)

Nimm doch einfach die Klammern von [c]void[/c] weg? Was soll das sein? Abgesehen davon geht natürlich [c]Out.print (appendArrays (a,b));[/c] auch nicht.


----------



## Kiri (13. Jan 2012)

das

[JAVA=67]private static void[] appendArrays (int [] a, int [] b)[/code]

müsste

so lauten


```
private static void appendArrays (int [] a, int [] b)
```


void steht für keinen Rückgabewert, also auch kein int oder int[] --> nur void


----------



## Derenei (13. Jan 2012)

Danke für eure hilfe. Wir haben erst heute mit den Arrays in der Schule angefangen und auch nur in der letzten Stunde da wir einen Test hatten. Nochmals vielen Dank. Jetzt funktioniert es tadellos.


----------



## Landei (13. Jan 2012)

Der "Typ" void fällt  in Java mächtig aus der Reihe. Die typtheoretisch "richtige" Lösung wäre gewesen, einen "echten" Typ void zu haben, der genau einen möglichen Wert hat (so wie boolean zwei Werte true und false hat), dann fiele die ganze Sonderbehandlung flach: Man könnte den void-Wert als Argument übergeben oder in Arrays packen (hört sich nicht sehr sinnvoll an, wäre es aber z.B. manchmal bei Generics) - halt ein ganz normaler Wert, der für "nix" steht. Aber so hat man ähnliche Probleme, wie wenn man bei der Arithmetik die 0 wegließe (um das Chaos komplett zu machen gibt es in Java übrigens noch einen "Wrapper-Typ" namens Void, der aber weder einen Wert hat, noch automatische Umwandlung ("unboxing") in Void unterstützt - aber das ist für dich erst einmal irrelevant).


----------



## faetzminator (14. Jan 2012)

Landei hat gesagt.:


> Man könnte den void-Wert als Argument übergeben oder in Arrays packen (hört sich nicht sehr sinnvoll an, wäre es aber z.B. manchmal bei Generics)


Ich würd mich da echt für ein Anwendungsbeispiel interessieren 


Landei hat gesagt.:


> gibt es in Java übrigens noch einen "Wrapper-Typ" namens Void


Du meinst in Reflection den Rückgabetyp für [c]void[/c]? Das wäre das einzige, was für mich Sinn machen würde...


----------



## Landei (14. Jan 2012)

faetzminator hat gesagt.:


> Ich würd mich da echt für ein Anwendungsbeispiel interessieren



Ein allgemeines Funktions-Interface könnte so aussehen:


```
interface F<A,B>() {
   public B eval(A a);
}
```

Das Interface deckt *alle *ein- und mehrstelligen Funktionen ab. Beispiele:


```
public class Abs implements F<Double, Double>() {
   public Double eval(Double x) { return Math.abs(x); }
}

//new Abs().eval(-3.0) ergibt 3.0

public class Add implements F<Double, F<Double, Double>>() {
   public F<Double, Double> eval(final Double x) { 
      return new F<Double, Double>(){
          public Double eval(Double y) { return x+y; }
      }
   }
}

//new Add().eval(-3.0).eval(5.0) ergibt 2.0
```

Das zweite Beispiel benutzt übrigens Currying. 

Nun fehlt die Möglichkeit, null-stellige Funktionen sauber zu implementieren, obwohl diese sehr nützlich sind (etwa zum Lazy Loading). 

Natürlich kann man mogeln, in dem man den Typ als Void angibt, und als Argument null übergibt, aber meine Meinung zu Null-Referenzen habe ich hier schon öfter zum Ausdruck gebracht, und es lassen sich sicher Beispiele finden, wo diese Lösung unbequem oder sogar unsicher ist. null ist kein richtiges Objekt, man kann daran kein toString, hashCode oder getClass aufrufen.

In funktionalen Sprachen und funktional orientierten Bibliotheken findet sich deshalb ein entsprechender Typ, z.B. in functionaljava :Unit (Functional Java 3.0) (zum Namen siehe Wikipedia, dort werden auch Schwierigkeiten mit Generics erwähnt)


----------

