Przekazanie wyniku funkcji do zmiennej

Odpowiedz Nowy wątek
2018-10-03 15:04
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)
...

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:

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, 2018-10-03 15:19

Pozostało 580 znaków

2018-10-03 15:20
0
    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

ICreature wonWarrior = whoFirst(this);
edytowany 1x, ostatnio: kamillapinski, 2018-10-03 15:21
W zasadzie, skoro funkcja jest niestatyczna, to w ogóle wywal argument battle i używaj this - kamillapinski 2018-10-03 15:22
No chyba nie. Wiesz jaka jest kolejność inicjalizacji pól w klasie? Teraz to chłop dostanie NPE co najwyzej. - Shalom 2018-10-03 15:23

Pozostało 580 znaków

2018-10-03 15:23

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ć:

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.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 1x, ostatnio: Shalom, 2018-10-03 15:24

Pozostało 580 znaków

2018-10-03 15:37
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, 2018-10-03 15:47

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0