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

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Jsroka (dyskusja | edycje)
Jsroka (dyskusja | edycje)
Linia 209: Linia 209:
       }
       }
     } '''catch''' (Exception w) {}
     } '''catch''' (Exception w) {}
  }
}
</div>
</div>
== Zadanie 4 ==
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'''.
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Rozwiązanie''' 
<div class="mw-collapsible-content" style="display:none">
'''import''' java.io.IOException;
'''class''' InnyMożliwyWyjątek '''extends''' Exception {}
'''class''' Zasób {
  Zasób(int i) {
    //...
  }
  '''void''' zarezerwuj() {}
  '''void''' używaj() '''throws''' IOException {}
  '''void''' innaNiebezpiecznaOperacja() '''throws''' InnyMożliwyWyjątek {}
  '''void''' zwolnij() {}
}
'''public''' '''class''' ZwalnianieZasobów2 {
  '''public''' '''static''' '''void''' main(String[] args) '''throws''' Exception {
    '''for''' (int i = 0; i < 10; i++) {
      Zasób z = '''new''' Zasób();
      '''try''' {
        z.zarezerwuj();
        //tu jest niebezpieczny kod
        z.używaj();
        z.innaNiebezpiecznaOperacja();
        //trzeba zwolnić zasób, bo kończy się obrót pętli
        '''if''' (i == 3) '''continue''';
        //trzeba zwolnić zasób, bo kończy się cała metoda
        '''if''' (i == 8) '''return''';
        //...
        //zwalnianie zasobów
        z.zwolnij();
      } '''catch''' (IOException e) {
        //obsługa wyjątku IOException
      } '''catch''' (InnyMożliwyWyjątek w) {
        //obsługa wyjątku InnyMożliwyWyjątek
      } finally {
        //zwalnianie zasobów
        z.zwolnij();
      }
    }
   }
   }
  }
  }
</div>
</div>
</div>
</div>

Wersja z 13:13, 28 lip 2006

Zadanie 1

Napisz metodę, które jako parametr będzie przyjmowała napis i wypisywała na standardowe wyjście jego długość.

  1. Przekaż do tej metody null i zobacz jaki wyjątek został zgłoszony.
  2. Otocz wywołanie metody blokiem try-catch, przechwyć ten wyjątek i wypisz na standardowe wyjście ślad stosu wywołań z chwili zgłoszenia wyjątku.
  3. Bezpośrednio po wypisaniu jego śladu zgłoś obsługiwany wyjątek ponownie.
  4. Czy ślady stosu wypisane przez ciebie w bloku catch i przez maszynę wirtualną w chwili przerwania programu są takie same?
  5. Przed zgłoszeniem ponownie obsługiwanego wyjątku wykonaj na nim metodę fillInStackTrace().
  6. Zamiast zgłaszać ponownie obsługiwany wyjątek zgłoś nowy wyjątek klasy Exception. Zauważ, że wymaga to pewnej dodatkowej zmiany w kodzie.
  7. Dołącz obsługiwany wyjątek do nowo tworzonego wyjątku Exception jako przyczynę jego powstania.

Rozwiązanie (część 1)

Rozwiązanie (część 2)

Rozwiązanie (część 3)

Rozwiązanie (część 4)

Rozwiązanie (część 5)

Rozwiązanie (część 6)

Rozwiązanie (część 7)

Zadanie 2

Napisz trzy nowe wyjątki oraz metodę, która za każdym wywołanie będzie losowo zgłaszała jeden z nich.

  1. Otocz wywołanie tej metody instrukcją try-catch zawierającą po klauzuli catch dla każdego z wyjątków. Niech każda klauzula catch wypisuje który wyjątek złapała.
  2. Sprawdź co się stanie jeżeli zmienisz kod metody tak żeby przestała zgłaszać jeden z wyjątków, ale nadal będzie on wymieniony w klauzuli throws nagłówka metody. Czy metody wywołujące napisaną przez ciebie metodę, ale nie obsługujące tego wyjątku będą musiały nadal go wymieniać w swoich nagłówkach?

Rozwiązanie (część 1)

Rozwiązanie (część 2)

Zadanie 3

Napisz program sprawdzający, czy wyjątki zgłoszone w klauzuli catch mogą być obsłużone przez tą samą klauzulę lub jedną z pozostałych klauzul tej samej instrukcji try-catch.

Rozwiązanie

Zadanie 4

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