Missing return-Statement

aYlien

Mitglied
Hallo Leute ich habe ein polymorphisches Objekt-Array angelegt und möchte daraus Dine anhand eines Kriteriums ausgeben.

Java:
    Buch selectBuch(String isbn){
        for(Buch b: db){
            if(b.getISBN().equals(isbn))
                return b;
        }
    }


"Buch" ist die Klasse von der das Array ist. Wieso bekomme ich hier die Meldung, dass das return fehlen würde?
 
überlege mal: was passiert wenn die isbn nirgends hinterlegt wurde die du abfrägst und deine if-anweisung somit niemals erfüllt wird?
 
es existiert auch noch eine andere Funktion eintragen.

Java:
    void eintragen(Buch buch){
        db[i]=buch;
        i++;
    }

    Buch selectBuch(String isbn){
        for(Buch b: db){
            if(b.getISBN().equals(isbn)){
                return b;
            } else
                return null;
        }
    }

Trotz der Veränderung kommt der o.g. Fehler! Die Augabe stammt aus einer alten Klausur. Ich glaube in der Klausur wird einfach davon ausgegangen, das in "db" diverse Buchobjekte enhalten sind.
 
und was ist wenn die db leer ist und die for-schleife niemals durchlaufen wird. Zudem wird hier nur ein Datensatz geprüft, weil dann, wenn der treffer nicht stimmt, else ausgeführt wird und null zurückgegeben wird.

Die einfachste Lösung wäre hier wohl:
Java:
Buch selectBuch(String isbn){
    for(Buch b: db){
        if(b.getISBN().equals(isbn))
            return b;
    }
    return null; // <-- Hier das return null einsetzen
}

wenn die for-schleife kein Ergebnis zurückliefert, gibt es auch keins => also gib [c]null[/c] zurück
 
Java:
    void eintragen(Buch buch){
        db[i]=buch;
        i++;
    }

    Buch selectBuch(String isbn){
        for(Buch b: db){
            if(b.getISBN().equals(isbn)){
                return b;
            } else
                return null;
        }
    }

Das wäre nicht nur falsch, sondern auch fatal! Denn dann würde nach dem ersten überprüften Buch sofort null zurückgegeben werden, wenn es nicht das richtige Buch ist! Und das wirst du ja nicht wollen. Daher ist der Vorschlag von Tomate_Salat besser, dass das
Code:
return null
nach der for-Schleife platziert wird.
 
Jo danke der Fehler ist jetzt wegg! Eine Frage noch, was denn wenn die Schleife jetzt im 5 Durchgang die ISBN sammt buch findet. Dann bekomme ich über das erste return das Buch zurück. Wird das zweite return jedesmal mit ausgeführt?

Wenn ja, wir kann ich das evtl. besser lösen?

Vielen dank!
 
nein, mit dem return-statement verlässt du die Methode (ausnahme bildet hier afaik [c]finally[/c], dieser Block wird soweit ich weis dann auch noch ausgeführt und könnte somit glaube das return manipulieren)
 
Jo danke der Fehler ist jetzt wegg! Eine Frage noch, was denn wenn die Schleife jetzt im 5 Durchgang die ISBN sammt buch findet. Dann bekomme ich über das erste return das Buch zurück. Wird das zweite return jedesmal mit ausgeführt?

Wenn ja, wir kann ich das evtl. besser lösen?

Vielen dank!

Da hast du wohl etwas falsch verstanden. Und zwar generell. Bei einem
Code:
return
springst du komplett aus der Methode, dh du bist nicht nur aus der Schleife, sondern ganz aus der Methode raus und gibst den Wert zurück. Somit wird das, was hinter der Schleife ist, auch nicht mehr ausgeführt. Etwas anderes wäre es mit
Code:
break
oder
Code:
continue
, aber das brauchst du hier absolut nicht. Um deine Frage zu beantworten, nein, es wird nicht aufgerufen, würde ja auch keinen Sinn machen, wenn bei einem Methodenaufruf zweimal ein
Code:
return
kommt.
 
nein, mit dem return-statement verlässt du die Methode (ausnahme bildet hier afaik [c]finally[/c], dieser Block wird soweit ich weis dann auch noch ausgeführt und könnte somit glaube das return manipulieren)

Ja, wenn du nen try-catch-Block hast. Aber bei folgendem Beispiel warnt dich Eclipse:

Java:
public class Test1 {
	public static void main(String[] args) {
		String t = test();
		System.out.println(t);
	}

	private static String test() {
		try {
			throw new Exception();
		} catch (Exception e) {
			return "test";
		} finally {
			return "finally";
		}
	}
}

finally block does not complete normally

Auch wenn dann das
Code:
return
im
Code:
finally
"zählt" wird man gewarnt, weil man sowas nicht tun sollte. Aber man darf es wohl.
 

Zurück
Oben