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

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Aneczka (dyskusja | edycje)
Nie podano opisu zmian
 
(Nie pokazano 23 wersji utworzonych przez 5 użytkowników)
Linia 1: Linia 1:
{{powrot|Programowanie obiektowe|}}
{{powrot|Programowanie obiektowe|do przedmiotu Programowanie obiektowe}}


{{powrot|PO Moduł 8|do modułu 8}}
{{powrot|PO Wyjątki c.d.|do wykładu Wyjątki c.d.}}


== Zadanie 1 ==
== 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''',  
Zmodyfikuj klasę ''ZwalnianieZasobów2'', aby zwalnianie odbywało się w bloku '''finally'''. Sprawdź, czy rzeczywiście zasób jest zwalniany nawet jak blok '''try''' jest opuszczany przy pomocy instrukcji '''return''',  
'''break''' i '''continue'''.
'''break''' i '''continue'''.
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
 
'''Rozwiązanie''' 
{{rozwiazanie|||
<div class="mw-collapsible-content" style="display:none">
}}
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
  '''import''' java.io.IOException;
  '''import''' java.io.IOException;
   
   
Linia 14: Linia 15:
   
   
  '''class''' Zasób3 {
  '''class''' Zasób3 {
   Zasób3(int i) {
   Zasób3('''int''' i) {
     //...
     //...
   }
   }
Linia 25: Linia 26:
  '''public''' '''class''' ZwalnianieZasobów3 {
  '''public''' '''class''' ZwalnianieZasobów3 {
   '''public''' '''static''' '''void''' main(String[] args) '''throws''' Exception {
   '''public''' '''static''' '''void''' main(String[] args) '''throws''' Exception {
     '''for''' (int i = 0; i < 10; i++) {
     '''for''' ('''int''' i = 0; i < 10; i++) {
       Zasób3 z = '''new''' Zasób3(i);
       Zasób3 z = '''new''' Zasób3(i);
       '''try''' {
       '''try''' {
Linia 38: Linia 39:
         //...
         //...
   
   
        //zwalnianie zasobów
        z.zwolnij();
       } '''catch''' (IOException e) {
       } '''catch''' (IOException e) {
         //obsługa wyjątku IOException
         //obsługa wyjątku IOException
Linia 55: Linia 54:


== Zadanie 2 ==
== 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.
Podczas rezerwowania i zwalniania zasobów zazwyczaj też może wystąpić wyjątek. Użyj pokazanej poniżej klasy ''Zasób4'' 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''' InnyMożliwyWyjątek '''extends''' Exception {}
  '''class''' JeszczeInnyMożliwyWyjątek '''extends''' Exception {}
  '''class''' JeszczeInnyMożliwyWyjątek '''extends''' Exception {}
   
   
  '''class''' Zasób4 {
  '''class''' Zasób4 {
   Zasób3(int i) {
   Zasób4('''int''' i) {
     //...
     //...
   }
   }
Linia 69: Linia 68:
  }
  }


<div class="mw-collapsible mw-made=collapsible mw-collapsed">
{{rozwiazanie|||
'''Rozwiązanie''' 
}}
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
  '''public''' '''class''' ZwalnianieZasobów4 {
  '''public''' '''class''' ZwalnianieZasobów4 {
   '''public''' '''static''' '''void''' main(String[] args) '''throws''' Exception {
   '''public''' '''static''' '''void''' main(String[] args) '''throws''' Exception {
     '''for''' (int i = 0; i < 10; i++) {
     '''for''' ('''int''' i = 0; i < 10; i++) {
       Zasób4 z1 = '''new''' Zasób4(i);
       Zasób4 z1 = '''new''' Zasób4(i);
       Zasób4 z2 = '''new''' Zasób4(i);
       Zasób4 z2 = '''new''' Zasób4(i);
Linia 90: Linia 89:
         //...
         //...
   
   
        //zwalnianie zasobów
        z1.zwolnij();
        z2.zwolnij();
       } '''catch''' (IOException e) {
       } '''catch''' (IOException e) {
         //obsługa wyjątku IOException
         //obsługa wyjątku IOException
Linia 114: Linia 110:


== Zadanie 3 ==
== Zadanie 3 ==
Sprawdź, czy '''finally''' jest wykonywane pomimo wystąpienia wyjątku w bloku '''catch''' z tej samej instrukcji.
Sprawdź, czy '''finally''' jest wykonywane pomimo wystąpienia wyjątku w bloku '''catch''' z tej samej instrukcji?
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
 
'''Rozwiązanie''' 
{{rozwiazanie|||
<div class="mw-collapsible-content" style="display:none">
}}
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
Tak, pokazuje to poniższy przykład.
Tak, pokazuje to poniższy przykład.
  '''public''' '''class''' Zad3 {
  '''public''' '''class''' Zad3 {
Linia 136: Linia 133:
== Zadanie 4 ==
== Zadanie 4 ==
Napisz klasę, której konstruktor zgłasza wyjątek. W metodzie ''main()'' utwórz egzemplarz tej klasy i obsłuż wyjątek.
Napisz klasę, której konstruktor zgłasza wyjątek. W metodzie ''main()'' utwórz egzemplarz tej klasy i obsłuż wyjątek.
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
 
'''Rozwiązanie''' 
{{rozwiazanie|||
<div class="mw-collapsible-content" style="display:none">
}}
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
  '''public''' '''class''' Zad44 {
  '''public''' '''class''' Zad44 {
   Zad4() '''throws''' Exception {
   Zad4() '''throws''' Exception {
Linia 156: Linia 154:


== Zadanie 5 ==
== 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.
Sprawdź, czy 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)''' 
{{rozwiazanie|(część 1)||
<div class="mw-collapsible-content" style="display:none">
}}
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
  '''class''' Nadklasa1 {
  '''class''' Nadklasa1 {
   Nadklasa1() '''throws''' Exception {}
   Nadklasa1() '''throws''' Exception {}
   Nadklasa1(int i) '''throws''' Exception {}
   Nadklasa1('''int''' i) '''throws''' Exception {}
  }
  }
   
   
Linia 171: Linia 170:
   }
   }
    
    
   Podklasa1(int i) '''throws''' Exception {
   Podklasa1('''int''' i) '''throws''' Exception {
     //pierwszą instrukcją jest try-catch,
     //pierwszą instrukcją jest try-catch,
     //więc kompilator uzna, że nie wskazujemy konstruktora nadklasy
     //więc kompilator uzna, że nie wskazujemy konstruktora nadklasy
Linia 185: Linia 184:
</div>
</div>


<div class="mw-collapsible mw-made=collapsible mw-collapsed">
{{rozwiazanie|(część 2)||
'''Rozwiązanie (część 2)''' 
}}
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
  '''class''' Nadklasa2 {
  '''class''' Nadklasa2 {
   int dajInt() {
   '''int''' dajInt() {
     System.out.println("Nadklasa2.dajInt()");
     System.out.println("Nadklasa2.dajInt()");
     '''return''' 0;
     '''return''' 0;
   }
   }
   int i = dajInt();
   '''int''' i = dajInt();
    
    
   {
   {
Linia 199: Linia 198:
   }
   }
    
    
   Nadklasa2(int i) {
   Nadklasa2('''int''' i) {
     System.out.println("konstruktor nadklasy");
     System.out.println("konstruktor nadklasy");
   }
   }
Linia 209: Linia 208:
   }
   }
   
   
   int inneDajInt() {
   '''int''' inneDajInt() {
     System.out.println("Podklasa2.inneDajInt()");
     System.out.println("Podklasa2.inneDajInt()");
     '''return''' 0;
     '''return''' 0;
   }
   }
   int i = inneDajInt();   
   '''int''' i = inneDajInt();   
    
    
   Podklasa2() {
   Podklasa2() {
Linia 237: Linia 236:
== Zadanie 6 ==
== Zadanie 6 ==
Zmodyfikuj definicje wyjątków w przykładzie z ''PerpetuumMobile'' tak, aby metoda ''jedź()'' mogła zgłaszać wyjątek ''ŁamiePrawaFizyki''
Zmodyfikuj definicje wyjątków w przykładzie z ''PerpetuumMobile'' tak, aby metoda ''jedź()'' mogła zgłaszać wyjątek ''ŁamiePrawaFizyki''
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
 
'''Rozwiązanie''' 
{{rozwiazanie|||
<div class="mw-collapsible-content" style="display:none">
}}
  '''class''' BłądContinuum '''extends''' RuntimeException {}
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
  '''class''' ŁamiePrawaFizyki '''extends''' Exception {}
  '''class''' BłądContinuum '''extends''' Exception {}
  '''class''' ŁamiePrawaFizyki '''extends''' RuntimeException {}
   
   
  '''abstract''' '''class''' Samochód {
  '''abstract''' '''class''' Samochód {

Aktualna wersja na dzień 20:08, 27 wrz 2020

<<< Powrót do przedmiotu Programowanie obiektowe

<<< Powrót do wykładu Wyjątki c.d.

Zadanie 1

Zmodyfikuj klasę ZwalnianieZasobów2, aby zwalnianie odbywało się w bloku 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żej klasy Zasób4 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ób4(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ź, czy 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)

Zadanie 6

Zmodyfikuj definicje wyjątków w przykładzie z PerpetuumMobile tak, aby metoda jedź() mogła zgłaszać wyjątek ŁamiePrawaFizyki

Rozwiązanie