# Methoden mit und ohne Rückgabewert



## JavaMeetsBlueJ (4. Mrz 2012)

Hallo, 
da ich anscheinend keinen Plan habe, was mein Buch mir sagen will, muss ich schlaue Menschen fragen, wieso folgendes Codebeispiel nicht compiliert werden kann. Ich will einfach nur verstehen, wann eine Methode auf Variablen zugreifen kann, die in einer anderen Methode initialisiert wurden.

EDIT

Dann baue ich auch noch klaren Mist zusammen. So solls rcihtig gemeint sein :


```
public class Test4
{

public static void main(String[] args)
{

boolean wahrheit = true ;
int count = 0;

rechne(wahrheit,count);
gucke();

}

public static boolean rechne( boolean wahrheit, int count)
{
for(count = 0; count <= 8; count++)
{
if(count == 5)
{
System.out.println(wahrheit);
return wahrheit = false;
}
}
}

public static void gucke()
{
System.out.println(wahrheit);

}


}
```


----------



## Gast2 (4. Mrz 2012)

> Ich will einfach nur verstehen, wann eine Methode auf Variablen zugreifen kann, die in einer anderen Methode initialisiert wurden.


Das geht niemals.
[EDIT]
Da war ich zu voreilig, hatte "deklariert" gelesen. Trotzdem ist sich Variable wahrheit in gucke() nicht sichtbar.
[/EDIT]

Dein Code wird nicht kompiliert weil die Methode gucke() einen boolean zurückgeben soll, macht se aber nicht.


----------



## JavaMeetsBlueJ (4. Mrz 2012)

Wieso ist wahrheit in gucke() nicht sichtbar?
Das selbe sagt mir mein Compiler auch.... .
lg


----------



## Gast2 (4. Mrz 2012)

Jede Variable hat einen Scope (Sichbarkeit). Wenn du eine Variable in einer Methode deklarierst, dann ist die auch nur diesem Block sichtbar.


----------



## JavaMeetsBlueJ (4. Mrz 2012)

Und wie mach ich diese Variable Sichtbar für andere Methoden?

Irgendwie müssen doch andere Methoden darauf Zugriff bekommen... Ich spiel damit eigentlich nur auf das Sudoku-Programm an... .

lg


----------



## DanZ (4. Mrz 2012)

JavaMeetsBlueJ hat gesagt.:


> ```
> return wahrheit = false;
> }
> ```



Btw: Bist du sicher, dass es nicht eher "wahrheit==false" bzw. "! wahrheit" sein sollte?

count zu übergeben macht auch wenig sinn...


----------



## HimBromBeere (4. Mrz 2012)

Du deklarierst die boolean wahrheit innerhalb der main, was bedeutet, dass sie auch nur dort verwendet werden kann. In der Funktion rechne() verwendest du nicht "diese wahrheit":lol:, sondern die aus der Parameterliste.
EDIT: Um wahrheit in anderen Funktionen nutzen zu können, mach sie zur Instanzvariablen (also noch vor die Defintion deiner main() und/oder evtl. Konstruktoren) mit 

```
public class MyClass{
    boolean wahrheit;
    // der ganze Rest
}
```


----------



## JavaMeetsBlueJ (4. Mrz 2012)

Wann muss ich denn überhaupt Parameter übergeben? Das wird in meinem Buch überhaupt nicht deutlich... .

lg


----------



## Gast2 (4. Mrz 2012)

> Und wie mach ich diese Variable Sichtbar für andere Methoden?
> 
> Irgendwie müssen doch andere Methoden darauf Zugriff bekommen...


Entweder legst du die Variable als Instanzvariable an, dann hat jede Methode innerhalb der Klasse zugriff darauf, oder du übergibst den Wert in die Funktion.
Man sollte den Scope einer Variablen immer so klein wie möglich halten, also nicht einfach alles in die Klasse knallen


----------



## DanZ (4. Mrz 2012)

JavaMeetsBlueJ hat gesagt.:


> Wann muss ich denn überhaupt Parameter übergeben? Das wird in meinem Buch überhaupt nicht deutlich... .
> 
> lg



Eben genau dann, wenn du in einer Methode auf einen Wert zugreifen willst, der sonst in der Methode nicht sichtbar ist


----------



## JavaMeetsBlueJ (4. Mrz 2012)

Sprich: Beim Sudoku-Programm jede Methode in eine andere Klasse und dann mittels Vererbung auf die Attribute zugreifen?

Ich dachte ich habs iwi gepeilt aber jetzt steh ich iwi vor einer ziemlich großen Wand.

lg


----------



## JavaMeetsBlueJ (4. Mrz 2012)

nichts


----------



## HimBromBeere (4. Mrz 2012)

Nein, natrülcih nicht... pack zusammen, was zusammen gehört. Objektorientiert heißt doch, dass du Objekte erstellst, die das gleiche können und die gleichen Eigenschaften besitzen (nur in anderen Ausprägungen natürlich).


----------



## DanZ (4. Mrz 2012)

JavaMeetsBlueJ hat gesagt.:


> Sprich: Beim Sudoku-Programm jede Methode in eine andere Klasse und dann mittels Vererbung auf die Attribute zugreifen?
> 
> Ich dachte ich habs iwi gepeilt aber jetzt steh ich iwi vor einer ziemlich großen Wand.
> 
> lg



Was auch immer das Sudoku Programm jetzt genau ist. Aber: nein. Versuch mal zu erklären was du machen willst, dann können wir dir vielleicht erklären wo dein Denkfehler liegt


----------



## Gast2 (4. Mrz 2012)

> Sprich: Beim Sudoku-Programm jede Methode in eine andere Klasse und dann mittels Vererbung auf die Attribute zugreifen?


Wie bitte? :autsch: :rtfm: Das macht doch gar keinen Sinn.
Dir fehlen noch ganz klar Grundlagen, entweder stehen die noch irgendwo in deinem BlueJ Buch oder du solltest dir mal nen anderes zulegen.


----------



## JavaMeetsBlueJ (4. Mrz 2012)

Ok also poste ich jetzt nochmal das Sudoku-Programm.

Das Problem ist, dass ich in der Methode pruefe_Ergebnis auf die aktualisierten Werte zugreifen möchte, die in den anderen drei Methoden neu initialisiert worden sind. ich bekomme aber nur die Werte in diese Methode, die ich den Variablen in der main-Methode zugewisen habe.

EDIT: falscher Code Sorry

anders mit boolean:


```
public class Test
{
    public static void main (String[] args)
    {
        int koordinate[][] = {
                {1,2,3,4,5,6,7,8,9},
                {1,2,3,4,5,6,7,8,9},
                {1,2,3,4,5,6,7,8,9},
                {1,2,3,4,5,6,7,8,9},
                {1,2,3,4,5,6,7,8,9},
                {1,2,3,4,5,6,7,8,9},
                {1,2,3,4,5,6,7,8,9},
                {1,2,3,4,5,6,7,8,9}, 
                {1,2,3,4,5,6,7,8,9} };

        int kaestchen[][] = new int[9][9];
        int spalte = 0;
        int zeile = 0;
        int element = 0;
        int count = 0;
        int count2 = 0;
        int i = 0;
        int spaltenanfang = 0;
        int spaltenende = 2;
        int zeilenanfang = 0;
        int zeilenende = 2;
        boolean isZeile = true ; // 1 gilt als Definition von wahr
        boolean isSpalte = true ;
        boolean isKaestchen = true ;

      
         //leseEingaben(zeile,spalte, element,koordinate);
         //pruefe_doppeltesVorkommen_in_Zeile(zeile,spalte, element,koordinate,isZeile);
        // pruefe_doppeltesVorkommen_in_Spalte( zeile, spalte, element, koordinate, isSpalte);
        pruefe_doppeltesVorkommen_in_dreimaldrei_Kaestchen(zeile, spalte, koordinate, kaestchen, count, count2, i, 
spaltenende,spaltenanfang,zeilenende, zeilenanfang, element, isKaestchen);
        pruefe_Ergebnisse(isZeile, isSpalte,isKaestchen);
    }

    public static void leseEingaben(int zeile, int spalte, int element, int koordinate[][])

    {
        for(zeile = 0; zeile <= 8; zeile++)
        {
            for (spalte = 0; spalte <= 8; spalte++)
            {
                System.out.print(koordinate[zeile][spalte] + " ");
            }
            System.out.println("");
            spalte = 0;
        }
    }
    // hier könnte noch eine Bedingeung rein, damit nur Zahlen von 1 bis 9 eine richtige Eingabe sind

    public static boolean pruefe_doppeltesVorkommen_in_Zeile(int zeile, int spalte, int element, int koordinate[][], boolean 
isZeile)
    {
        zeile = 0;
        element = 0;

        for(zeile = 0; zeile <= 8; zeile++)
        {
            for (element = 0; element <= 8; element++)
            {
                for(spalte = 0; spalte <= 8; spalte++)
                {
                    if(koordinate[zeile][element] == koordinate[zeile][spalte] && spalte != element)
                    {

                         return false;
                        break;
                    }

                    if(koordinate[zeile][element] != koordinate[zeile][spalte])
                    {
                        System.out.println("Zahl in Zeile " + (zeile + 1) + " und Spalte " + (spalte + 1) + " ist ungleich der Zahl in Spalte " + (element + 1));
                    }
                }
            }
        }
    }

    public static boolean pruefe_doppeltesVorkommen_in_Spalte(int zeile, int spalte, int element, int koordinate[][], boolean 
isSpalte)
    {
        zeile = 0;
        spalte = 0;
        element = 0;

        for(spalte = 0; spalte <= 8; spalte++)
        {
            for(element = 0; element <= 8; element++) 
            {
                for(zeile = 0; zeile <= 8; zeile++)
                {
                    if(koordinate[zeile][spalte] == koordinate[element][spalte] &&  zeile != element   )
                    {
                       return false;
                        break;

                    }

                    if(koordinate[zeile][spalte] != koordinate[element][spalte])
                    {
                        System.out.println("Die Zahl in Spalte " + (spalte+1) + "und Zeile" + (zeile+1) + "ist UNGLEICH der Zahl in Zeile" + (element+1)); 
                    }
                }
            }
        }
    }

    public static boolean pruefe_doppeltesVorkommen_in_dreimaldrei_Kaestchen(int zeile, int spalte, int koordinate[][], int kaestchen[][], int count, int count2, int i, int spaltenanfang,int spaltenende, int zeilenanfang, int zeilenende, int element,boolean isKaestchen)
    {
        zeile = 0;
        spalte = 0;

        count = 0;
        count2 = 0;
        i = 0;
        spaltenanfang = 0;
        spaltenende = 2;
        zeilenanfang = 0;
        zeilenende = 2;

        // Hier muss so schnell wie möglich ein vernünftiger Algorithmus hinne!!!
        for(count = 0; count <= 8; count++)

        {
            for(zeile = 0; zeile <= 2; zeile++)
            { 

                for(spalte = spaltenanfang; spalte <= spaltenende; spalte++) 
                {

                    kaestchen[count2][i] = koordinate[zeile][spalte];

                   // System.out.print(kaestchen[count][i]);
                    i++;

                }

            } 
            count2++;
            i = 0;
            if(spaltenende <= 8)
            {spaltenanfang += 3;
                spaltenende += 3;
                if(spaltenende > 8)
                {
                    zeilenanfang += 3;
                    spaltenanfang = 0;
                    spaltenende = 2;
                }
            }

        }

        for(count = 0; count <= 8; count++)
        {
            for(element = 0; element <= 8; element++) 
            {
                for(count2 = 0; count2 <= 8; count2++)
                {
                    if(kaestchen[count][element] == kaestchen[count][count2] && element != count2)
                    {

                      return false;
                        break;

                    }

                    
                }
             
            }  
        }
    }

    public static void pruefe_Ergebnisse(boolean isZeile, boolean isSpalte, boolean isKaestchen)
    {
        isZeile =  pruefe_doppeltesVorkommen_in_Zeile(zeile, spalte, element, koordinate, isZeile);
        isSpalte = pruefe_doppeltesVorkommen_in_Spalte(zeile, spalte, element, koordinate, isSpalte);
        isKaestchen = pruefe_doppeltesVorkommen_in_dreimaldrei_Kaestchen( zeile,spalte, koordinate, kaestchen, count, count2, i,  spaltenanfang, spaltenende, zeilenanfang, zeilenende, element, isKaestchen);
        
        
        
        if(isZeile == false || isSpalte == false|| isKaestchen == false)
        {
            System.out.println("Das Sudoku enthält einen Fehler");
        }
        else
        {
            System.out.println("Das Sudoku wurde erfolgreich gelöst");
        }
    }

    
}
```


----------



## vimar (4. Mrz 2012)

Also es gibt einen Unterschied zwischen: eine variable deklarieren und eine variable initialisieren.


```
int i;
```
 hier deklariert man nur.

```
i = 3;
```
 hier initialisierst du.

```
int i = 3;
```
 hier deklarierst und initialisierst du.


1. Möglichkeit:


```
public class Test4
{
 
public static void main(String[] args)
{
 
boolean wahrheit = true ;
int count = 0;
 
rechne(wahrheit,count);
gucke(wahrheit); // <- hier die "referenz" von wahrheit übergeben.
 
}
```

2. möglichkeit:


```
public class Test4
{
   boolean wahrheit = true ; // hier hin tun, dann kannste von jeder methode drauf zugreifen.

public static void main(String[] args)
{
 

int count = 0;
 
rechne(wahrheit,count);
gucke();
 
}
```

2.2. möglichkeit:


```
public class Test4
{
  boolean wahrheit;
public static void main(String[] args)
{
 
 wahrheit = true ;
int count = 0;
 
rechne(wahrheit,count);
gucke(); // nun kannste auch auf wahrheit zugreifen.
 
}
```

vllt bringts dir was


----------



## Gast2 (4. Mrz 2012)

Nein, der ist nicht durchschaubar. Obendrein hat das nichts mit Objektorientierung zu tun 

Wie auch schon im anderen Thread erwähnt:

```
pruefe_doppeltesVorkommen_in_Spalte
```
 sollte einen boolean zurückgeben, genauso wie die anderen prüf-Methoden.


----------



## JavaMeetsBlueJ (4. Mrz 2012)

EikeB hat gesagt.:


> Wie bitte? :autsch: :rtfm: Das macht doch gar keinen Sinn.
> Dir fehlen noch ganz klar Grundlagen, entweder stehen die noch irgendwo in deinem BlueJ Buch oder du solltest dir mal nen anderes zulegen.




Das selbe dachte ich mir, als ich das gepostet hab


----------



## DanZ (4. Mrz 2012)

EikeB hat gesagt.:


> Nein, der ist nicht durchschaubar. Obendrein hat das nichts mit Objektorientierung zu tun



Und außerdem viel zu kompliziert, falls er nicht nebenbei noch eine Supernova simulieren soll.

Schließend aus dem Code geb ich dir folgenden Tip: Deklariere nur dann eine neue Variable wenn du absolut keine Möglichkeit findest sie zu umgehen.


----------



## JavaMeetsBlueJ (4. Mrz 2012)

Ich wüsste nicht, wie ich sonst 9x9 Arrays auslesen sollte und eine Zahl auf doppeltes Vorkommen hin zu überprüfen... . Sry

Hat irgendwer Buchtips, denn das Problem scheint nicht methematischer Natur, sondern ist eher, dass ich die Sprachgrundlagen nicht beherrsche, wie EikeB leider(für mich) festgestellt hat.

lg


----------



## Gast2 (4. Mrz 2012)

Java von Kopf bis Fuß ist nen gutes Einsteigerbuch. Ansonsten einfach mal hier im Forum suchen, die Frage gibts öfter.


----------



## vimar (4. Mrz 2012)

sudoku ist nix für java, sondern für prolog


----------

