obsługa prostych wyjątków

0

Witam ponownie. Tym razem napisałem program, ale nie działa. potrzebuję informacji co zrobiłem nie tak.

Zadanie ma zawierać obsługę wyjątków.
Chodzi o zrobienie rakiety z polami nazwa oraz waga paliwa.
w klasie Rakieta mają być dwie metody zatankuj() oraz start();
Jeżeli będzie za mało paliwa to ma zostać podniesiony wyjątek.

Zadanie wydaje sie proste, przerabialiśmy je na zajęciach, a jednak teraz kiedy próbuje zrobić je od zera po mojemu nie działa jak należy.

Stworzyłem klasę RakietaTest (oczywiście wcześniej utworzyłem klasę Rakieta oraz klasę ZaMałoPaliwaException dziedziczącą po Exception.
W kodzie umieściłem metodę zatankuj () w pętli do while....
Wydawało mi sie że Rakieta będzie się tankowała dopóki nie zostanie spełniony warunek CzyZatankowana. a później kompilator przejdzie do metody start() i wszystko zadziała. Niestety po komunikacie za mało paliwa program kończy działanie. gdzie jest problem?

public class Rakieta {

	String nazwa;
	int wagaPaliwa;
	
	Rakieta(String nazwa, int wagaPaliwa){
		this.nazwa= nazwa;
		this.wagaPaliwa = wagaPaliwa;
	}
	
	public void zatankuj(){
		Random r = new Random();
		wagaPaliwa += r.nextInt(200);	
		System.out.println("Waga zatankowanego paliwa " + wagaPaliwa);
	}
	public void start() throws ZaMaloPaliwaException{
		if(wagaPaliwa<1000) throw new ZaMaloPaliwaException();
		System.out.println("Start rakiety za 3,2,1.......");
	}
}

Klasa RakietaTest

public class RakietaTest {

	public static void main(String[] args) {
		
		Rakieta r1 = new Rakieta ("Stinger", 500);
		
		boolean CzyZatankowana = false;
		
		do {
			r1.zatankuj();
			if(r1.wagaPaliwa>=1000) {CzyZatankowana = true;}
			} while (CzyZatankowana = false);
		try {
			r1.start();
				} catch (ZaMaloPaliwaException e) {
					System.out.println(e);
		}
	}

}
2
CzyZatankowana = false;

Powinny być 2 ==
Innymi słowy przypisujesz false, zamiast sprawdzać.

0

No comment...
Brak słów... dziękuje za pomoc :)

3

Ogólnie pisanie while( CzyZatankowana == false) mimo, że zadziała, nie jest fajne.
Lepiej zapisać while(!CzyZatankowana), a najlepij zmienić nazwę tej zmiennej. while(!zatankowana).

Zasada ogólna: we wszelkiego rodzaju sprawdaniu warunkow logicznych najlepiej unikać przyrównywania do **false **lub true i spróbować zapisać * zdanie logiczne * bezpośrednio.

0
jarekr000000 napisał(a):

Lepiej zapisać while(!CzyZatankowana), a najlepij zmienić nazwę tej zmiennej. while(!zatankowana).

Jak to interpretować? CzyZatankowana ma przypisaną wartość false.

(!CzyZatankowana) oznacza "nie" false tj. true? Wykonuj pętle dopóki wartość CzyZatankowana = true?

1

Kod:

boolean CzyZatankowana = false;

do {
            r1.zatankuj();
            if(r1.wagaPaliwa>=1000) {CzyZatankowana = true;}
} while (CzyZatankowana = false);

zamień na:

boolean paliwoZatankowane = false;

do {
            r1.zatankuj();
            if(r1.wagaPaliwa>=1000) {paliwoZatankowane = true;}
} while (!paliwoZatankowane);

albo

int nrTankowania = 0;
final int limitTankowan = 5;

boolean paliwoZatankowane = false;
do {
            r1.zatankuj();
            if(r1.wagaPaliwa>=1000) {paliwoZatankowane = true;}
} while (!paliwoZatankowane || nrTankowania++ < limitTankowan);

Bo aktualnie to wygląda jak:

do {
            r1.zatankuj();
            if(r1.wagaPaliwa>=1000) break;
} while (true);

co spowoduje pętlę nieskończoną jeśli zabraknie paliwa w cysternie.

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