Przekazanie wyniku funkcji do zmiennej

Przekazanie wyniku funkcji do zmiennej
Dawid Sosnowicz
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 6 lat
  • Postów:4
0

Próbuję przekazać wynik funkcji whoFirst() do zmiennej wonWarrior, a następnie do funkcji hitPower().
Gdy przypisuję coś do wonWarrior mam taki błąd:
Exception in thread "main" java.lang.StackOverflowError
at pl.killers.engine.Battle.<init>(Battle.java:26)
at pl.killers.engine.Battle.<init>(Battle.java:26)
...

Kopiuj
public class Battle {

    ICreature firstWarrior;
    ICreature secondWarrior;

    public Battle(ICreature firstWarrior, ICreature secondWarrior) {
        this.firstWarrior = firstWarrior;
        this.secondWarrior = secondWarrior;
    }

    public ICreature whoFirst(Battle battle) {

        if(battle.firstWarrior.getSpeed() > battle.secondWarrior.getSpeed()) {
            return battle.firstWarrior;
        } else {
            return battle.secondWarrior;
        }
    }

    ICreature wonWarrior; //= whoFirst(new Battle(this.firstWarrior, this.secondWarrior));

    public double hitPower() {
        return wonWarrior.getStrength();
    }

}

main:

Kopiuj
public class Killers {
    public static void main (String[] args) {
        ICreature cow = new Cow("Deniro");
        ICreature cat = new Cat("Puncio");

        Battle battle = new Battle(cow, cat);

        System.out.println("kto zaczyna: " + battle.whoFirst(battle).getName());

    }
}
edytowany 3x, ostatnio: Dawid Sosnowicz
KA
  • Rejestracja:prawie 7 lat
  • Ostatnio:2 dni
  • Lokalizacja:Warszawa
  • Postów:41
0
Kopiuj
    ICreature wonWarrior = whoFirst(new Battle(this.firstWarrior, this.secondWarrior));

Zwróć uwagę na new Battle :) Tworzysz Battle w Battle i tak w nieskończoność.

Zmień na

Kopiuj
ICreature wonWarrior = whoFirst(this);
edytowany 1x, ostatnio: kamillapinski
KA
W zasadzie, skoro funkcja jest niestatyczna, to w ogóle wywal argument battle i używaj this
Shalom
No chyba nie. Wiesz jaka jest kolejność inicjalizacji pól w klasie? Teraz to chłop dostanie NPE co najwyzej.
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

No a teraz zastanów się sekundę nad tym co robisz...
ICreature wonWarrior; //= whoFirst(new Battle(this.firstWarrior, this.secondWarrior));
ta zmienna to jest POLE OBIEKTU KLASY i jego wartość jest nadawana kiedy tworzysz obiekt klasy Battle. A ty próbujesz tam wrzucić wynik jakiejś funkcji na new Battle(this.firstWarrior, this.secondWarrior), czyli chcesz stworzyć NOWY OBIEKT! A do stworzenia tego obiektu znów potrzeba przypisać wartość do pola, co powoduje tworzenie KOLEJNEGO OBIEKTU...

Rozwiazanie: nadaj wartość w konstruktorze! W ogóle to powinno być:

Kopiuj
public class Battle {

    ICreature firstWarrior;
    ICreature secondWarrior;
    ICreature wonWarrior;

    public Battle(ICreature firstWarrior, ICreature secondWarrior) {
        this.firstWarrior = firstWarrior;
        this.secondWarrior = secondWarrior;
        this.wonWarrior = whoFirst();
    }

    public ICreature whoFirst() {
        if(this.firstWarrior.getSpeed() > this.secondWarrior.getSpeed()) {
            return this.firstWarrior;
        } else {
            return this.secondWarrior;
        }
    }

    public double hitPower() {
        return wonWarrior.getStrength();
    }

}

Moim zdaniem ma to w ogóle niewielki sens, no ale jak chcesz tak pisać to pisz.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
Dawid Sosnowicz
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 6 lat
  • Postów:4
0
Shalom jesteś wielki, dziękuję ;).

Jeszcze zapytam.. jeśli ma to w ogóle niewielki sens to mógłbyś mnie naprowadzić jak to powinno wyglądać żeby miało sens?

edytowany 1x, ostatnio: Dawid Sosnowicz

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.