PO Wyjątki c.d. - ćwiczenia: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Jsroka (dyskusja | edycje)
Jsroka (dyskusja | edycje)
Linia 148: Linia 148:
   }  
   }  
  }
  }
</div>
</div>
== Zadanie 5 ==
Sprawdź, że konstruktor podklasy nie może obsłużyć wyjątków zgłaszanych przez konstruktor nadklasy. Napisz przykładowy kod pokazujący, że konstruktor nadklasy jest wykonywany wcześniej niż wskazuje na to umiejscowienie słowa '''super''' w konstruktorze podklasy.
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Rozwiązanie (część 1)''' 
<div class="mw-collapsible-content" style="display:none">
class Wyj extends Exception {}
class Nadklasa1 {
  Nadklasa1() throws Wyj {}
  Nadklasa1(int i) throws Wyj {}
}
class Podklasa1 extends Nadklasa {
  Podklasa1() throws Wyj {
    //nie wskazujemy konstruktora nadklasy, więc będzie użyty bezparametrowy
    //nie ma co otaczać instrukcją try-catch
  }
 
  Podklasa1(int i) throws Wyj {
    //pierwszą instrukcją jest try-catch,
    //więc kompilator uzna, że nie wskazujemy konstruktora nadklasy
    //i użyje bezparametrowego
    try {
      //tu nie może być odowołania do konstruktora nadklasy, bo to nie jest pierwsza instrukcja
      //super(i);
      throw new Wyj();
    } catch (Wyj w) {}
  }
}
</div>
</div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Rozwiązanie (część 2)''' 
<div class="mw-collapsible-content" style="display:none">
'''class''' Nadklasa2 {
  int dajInt() {
    System.out.println("Nadklasa2.dajInt()");
    '''return''' 0;
  }
  int i = dajInt();
 
  {
    System.out.println("blok inicjalizacji w Nadklasa2");
  }
 
  Nadklasa2(int i) {
    System.out.println("konstruktor nadklasy");
  }
}
'''public''' '''class''' Podklasa2 '''extends''' Nadklasa2 {
  {
    System.out.println("blok inicjalizacji w Podklasa2");
  }
  int inneDajInt() {
    System.out.println("Podklasa2.inneDajInt()");
    '''return''' 0;
  }
  int i = inneDajInt(); 
 
  Podklasa2() {
    //musimy wskazać konstruktor, bo nie ma bezparametrowego
    '''super'''(0);
    System.out.println("konstruktor podklasy");
  }
  '''public''' '''static''' '''void''' main(String[] args) {
    Podklasa2 p = '''new''' Podklasa2();
  }
}
Nadklasa2.dajInt()
blok inicjalizacji w Nadklasa2
konstruktor nadklasy
blok inicjalizacji w Podklasa2
Podklasa2.inneDajInt()
konstruktor podklasy
</div>
</div>
</div>
</div>

Wersja z 16:19, 30 lip 2006

Zadanie 1

Zmodyfikuj klasę ZwalnianieZasobów2, aby zwalnianie odbywało się w klauzuli finally. Sprawdź, czy rzeczywiście zasób jest zwalniany nawet jak blok try jest opuszczany przy pomocy instrukcji return, break i continue.

Rozwiązanie

Zadanie 2

Podczas rezerwowania i zwalniania zasobów zazwyczaj też może wystąpić wyjątek. Użyj pokazanej poniższej klasy Zasób3 i zmodyfikuj swoje rozwiązanie poprzedniego zadania, tak aby zawsze oba zasoby były zwalniane. Zadbaj żeby nie dochodziło do zaginięcia żadnych wyjątków. Możesz założyć, że wykonanie operacji zwolnij() na zamkniętym zasobie jest dozwolone.

class InnyMożliwyWyjątek extends Exception {}
class JeszczeInnyMożliwyWyjątek extends Exception {}

class Zasób4 {
  Zasób3(int i) {
    //...
  }
  void zarezerwuj() throws IOException {}
  void używaj() throws IOException {}
  void innaNiebezpiecznaOperacja() throws InnyMożliwyWyjątek, JeszczeInnyMożliwyWyjątek {}
  void zwolnij() throws IOException {}
}

Rozwiązanie

Zadanie 3

Sprawdź, czy finally jest wykonywane pomimo wystąpienia wyjątku w bloku catch z tej samej instrukcji.

Rozwiązanie

Zadanie 4

Napisz klasę, której konstruktor zgłasza wyjątek. W metodzie main() utwórz egzemplarz tej klasy i obsłuż wyjątek.

Rozwiązanie

Zadanie 5

Sprawdź, że konstruktor podklasy nie może obsłużyć wyjątków zgłaszanych przez konstruktor nadklasy. Napisz przykładowy kod pokazujący, że konstruktor nadklasy jest wykonywany wcześniej niż wskazuje na to umiejscowienie słowa super w konstruktorze podklasy.

Rozwiązanie (część 1)

Rozwiązanie (część 2)