Zdravím,
snažím se procvičit si výjimky na školních příkladech a narazil jsem na problém.
K dispozici mám následující třídu Dancer:
public class Dancer
{
private Dancer partner;
private boolean female;
private int number;
/**
* @param number Dancer's number
* @param isFemale Dancer's genre
*/
public Dancer(int number, boolean isFemale) {
this.number = number;
female = isFemale;
}
/**
* @return true if the dancer has a partner
*/
public boolean hasPartner() {
return partner != null;
}
/**
* @return true if the dancer is female
*/
public boolean isFemale() {
return female;
}
/**
* @return true if the dancer is male
*/
public boolean isMale() {
return !female;
}
/**
* @return dancer's number
*/
public int getNumber() {
return number;
}
/**
* Breaks the dancing pair, i.e. unsets partner of this dancer and vice versa.
*
* @return false if this dancer had no partner.
*/
public boolean unsetPartner() {
if (!hasPartner()) return false;
partner.partner = null;
partner = null;
return true;
}
Za úkol mám vytvořit hlídanou výjimku DancerException, která bude mít alespoň jeden konstruktor s textovým popisem chyby. Můj kód:
public class DancerException extends Exception
{
public DancerException() {
super();
}
public DancerException(String message) {
super("Dancer exception.");
}
}
Teď to, kde si nevím rady:
Do třídy Dancer doplňte metody pro vytvoření a zrušení tanečního páru podle následující dokumentace. Jakékoliv jiné změny ve třídě jsou nepřípustné.
Metoda void setPartner(Dancer partner) propojí tanečníka s partnerem A NAOPAK:
/**
* Creates dancing pair. This method assignes the given dancer as a partner
* of this dancer and vice versa.
*
* @param partner Person to be assigned as our partner in dancing pair
* @throws NullPointerException if the partner parametr is null
* @throws DancingException if either this dancer or the given partner are alredy in a pair
* (they already have a partner)
* @throws DancingException if this dancer and the given partner are of the same genre
*/
Pozn: Volání metody setPartner() na partnerovi uvnitř samotného setPartner() vede k zacyklení. Místo toho využijte fakt, že máme přístupné i privátní atributy partnera.
Zkoušel jsem to takhle:
public void setPartner(Dancer partner) throws NullPointerException, DancerException {
if(partner == null) throw new NullPointerException("partner");
try {
this.partner = partner;
partner.partner = this;
} catch (Exception e) {
throw new DancerException(e.getMessage());
}
Nicméně se nedomnívám, že je to podle té dokumentace správně.
Zkoušel jsem to takto, ale to není hlídaná výjimka a navíc to pak dělá neplechu dál v programu:
public void setPartner(Dancer partner) throws NullPointerException, DancerException {
if(partner == null) throw new NullPointerException("partner");
if( (partner.hasPartner() != false) || (partner.partner.hasPartner() != false) )
throw new DancerException("Dancer already has a partner.");
if(this.partner.isMale() == partner.isMale()) throw new DancerException("Dancers have the same gender.");
this.partner = partner;
partner.partner = this;
Budu rád za každou radu. Díky.