obsługa prostych wyjątków

obsługa prostych wyjątków
D1
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:26
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?

Kopiuj
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

Kopiuj
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);
		}
	}

}
Burdzi0
  • Rejestracja:prawie 9 lat
  • Ostatnio:3 dni
  • Lokalizacja:Futurama
  • Postów:887
2
Kopiuj
CzyZatankowana = false;

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


Bite my shiny metal ass!
Life throws you an error code like that, you don't have the luxury of a ZnVja2luZw== pop-up explanation *Robię projekty studenckie, pisz priv ;) *
edytowany 1x, ostatnio: Burdzi0
D1
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:26
0

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

Burdzi0
Spoko, mały protip - dobre IDE powinno takie cuda wyłapywać i podkreślać jako warning
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
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.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 2x, ostatnio: jarekr000000
D1
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:26
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?

edytowany 1x, ostatnio: dombek100
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
1

Kod:

Kopiuj
boolean CzyZatankowana = false;

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

zamień na:

Kopiuj
boolean paliwoZatankowane = false;

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

albo

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

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

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

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.