Java: missing return statement

02/08/2013 19:37 Skipp3r#1
hallo, ich habe folgenden quelltext und er lässt sich einfach nicht kompilieren, wo steckt der Fehler?

Code:
public boolean Zeile(int zeile, int zahl)
        {
                for (int i = 0; i < 9; i++)
                {
                    if (feld[zeile][i] == zahl)
                    {
                        return false;
                    }
                    else
                    {
                        return true;
                    }
                }
        }
Ich returne ja true/false wenn die übergebene zahl im Feld vorhanden ist, deswegen verstehe ich nicht wiso er trozdem ein return statement will?

mfg
02/08/2013 20:10 Devil0s#2
Du nimmst ja wahrscheinlich Eclipse oder Netbeans. Deshalb kannst du ja sehen wo diese Programme das return Statement setzen, nämlich hinter die for-Schleife.
Das liegt daran, dass die for-Schleife nicht immer ausgelöst werden muss (zwar ist es in diesem Fall so.)
Deshalb muss hinter die for-Schleife auch ein return Statement.

Methoden fangen mit nem kleinen Buchstaben an!!!
02/08/2013 20:19 xNopex#3
Dein Code macht eh keinen Sinn. Wenn du die for-Schleife weglassen würdest und das i durch eine 0 ersetzen würdest, ergebe das dasselbe Verhalten wie dein Code jetzt.
02/08/2013 20:27 Skipp3r#4
Ich habe jetz einfach mal ein return false unter die for schleife gesetzt, gibt er mir dann trozdem true falls die zahl in der matrix vorhanden ist oder wird der boolean wert dann wieder zu false überschrieben?

Warum macht der code keinen sinn ?
Btw ich benutze BlueJ, da wir in der Schule damit programmieren und ich der Übersicht halber nicht auf exlipse oder netbeans umsteigen wollte.
02/08/2013 20:28 xNopex#5
Quote:
Warum macht der code keinen sinn ?
Nimm nen Debugger zur Hand und steppe durch den Code, wenn du 's nicht siehst.
02/08/2013 20:33 Skipp3r#6
Hier mal der ganze Code, kannst du mir sagen was daran falsch ist bzw was schlecht umgesetzt/durchdacht ist ? Wär echt klasse weil ich weis langsam nichtmehr weiter..

Code:
import java.util.*;

public class Sudoku
{
    //Felder:
    private int [][] feld; //Adjazenzmatrix (quasi späteres Sudoku da 9x9)
    private int [] anfangszahlen; //Feld aus dem zufällig generierte Zahlen von 1-9 ins Feld übernommen werden können
    private int [] doppelt; //Feld um Duplikate in anfangszahlen zu vermeiden
    
    Random zufall = new Random();
    
    public Sudoku()
    {
        feld = new int [9][9];
        anfangszahlen = new int [9];
        doppelt = new int [9];

        
        //doppelt-Feld füllen:
        for (int i = 0; i < doppelt.length; i++)
        {
                doppelt [i] = i + 1;
        }
        
        
        //Anfangszahlen generieren:
        for (int i = 0; i < anfangszahlen.length; i++)
        {
                int wert = zufall.nextInt(9);
                if (doppelt[wert] > 0)
                {
                    anfangszahlen[i] = doppelt[wert];
                    doppelt[wert] = -1;
                }
                else
                {
                    i = i - 1;
                }
        }
        
        //Matrix füllen:
        // I = Zeile, J = Spalte!!
        
        for (int i = 0; i < feld.length; i++)
        {
                feld[i][0] = anfangszahlen[i];
        }
        
        
        }    
        // Methode um Existenz der generierten zahlen in der 1. zeile zu sehen
        public void ausgeben()
        {
             for (int i = 0; i < feld.length; i++)
             {
                   System.out.print(" "+feld[0][i]);
             }
        }
        
        
        //Methoden um zu überprüfen ob die gesuchte Zahl in der angegebenen Zeile/Spalte/Karee schon enthalten ist, gibt false aus wenn NICHT
        public boolean Zeile(int zeile, int zahl)
        {
                for (int i = 0; i < feld.length; i++)
                {
                    if (feld[zeile][i] == zahl)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                return false;
        }
        
        
        public boolean Spalte(int spalte, int zahl)
        {
            for (int i =0; i < feld.length; i++)
            {
                if ( feld [i][spalte] == zahl)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            return false;
        }
        
        //Um Karee auszuwählen wird der Wert 
        public boolean Karee(int h,int v, int zahl)
        {
            
        }
        
    }
02/08/2013 20:37 xNopex#7
Ich schau mir jetzt nicht deinen ganzen Code an, weil mir dazu die Zeit und Lust fehlt, aber in folgender Methode:

Code:
public boolean Spalte(int spalte, int zahl)
        {
            for (int i =0; i < feld.length; i++)
            {
                if ( feld [i][spalte] == zahl)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            return false;
        }
Wird er die for-Schleife nur einmal durchlaufen. Im ersten Durchlauf ist i=0. Er überprüft ob feld[i][zeile] gleich der Zahl ist. Wenn ja returned er true. Sonst false. Das wars. Return = unmittelbares Verlassen der Methode.

EDIT: Hab die falsche Methode rauskopiert. Bei der Zeilen-Methode ist das aber ähnlich.
02/08/2013 20:42 Skipp3r#8
ah also müsste wenn die zahl bei i = 0 nicht die übergebene zahl ist, i um 1 erhöht werden und nochmal geguckt werden ob gleich zahl ist sprich else fliegt komplett raus
02/08/2013 21:15 Devil0s#9
Ich glaube bei der Methode "Zeile" solltest du
Code:
for (int i = 0; i < feld[zeile].length; i++)
schreiben.

Ist aber egal da das Feld ja 9x9 ist.
02/08/2013 21:36 Skipp3r#10
Quote:
Originally Posted by Devil0s View Post
Ich glaube bei der Methode "Zeile" solltest du
Code:
for (int i = 0; i < feld[zeile].length; i++)
schreiben.

Ist aber egal da das Feld ja 9x9 ist.
Jow ich hätte auch 9 reinschreiben können aber ich hab mir gedacht wenn ich mal irgentwann lust habe kp 12 oder 16 Felder zu generieren dann muss ich nicht überall die Feldlänge umändern.
Und sudoku felder sind ja grundsätzlich symmetrisch.

Aber das stimmt jetz schon so wenn ich bei der if bedingung das else komplett rausnehme, dann such er mir schon alle bis 9 oder falls er das richtige findet, durch ??

mfg
02/08/2013 22:39 Devil0s#11
Du hast doch das dann doch so ungefähr so oder??

Code:
public boolean Zeile(int zeile, int zahl)
        {
                for (int i = 0; i < 9; i++)
                {
                    if (feld[zeile][i] == zahl)
                    {
                        return false;
                    }
                }
                return false;
        }
Das funktioniert doch dann.
02/09/2013 15:22 Skipp3r#12
Code:
public boolean Zeile(int zeile, int zahl)
{
    for (int i = 0; i < 9; i++)
    {
        if (feld[zeile][i] == zahl)
        {
            return true;
        }
    }
    return false;
}
So ja, müsste gehen. Habs jetz auch soweit muss später mal gucken obs dann läuft aber ja ;) Trozdem vielen Dank!