SCJP, podejście piąte

Kolejny rozdział podręcznika przerobiony. Dotyczył on sterowania przepływem, asercjami oraz wyjątkami. Ciekawa lektura, pełna olbrzymiej wręcz ilości potencjalnych kruczków przy układaniu pytań testowych. O dziwo końcowe zadania poszły mi powiedziałbym bardzo dobrze, chyba zaczynam ‘czuć’ pytania, a także potencjalne odpowiedzi. Rzecz, która może tylko cieszyć.

Oczwyście nie ustrzegłem się kilku potknięć, oto lista rzeczy wartych zapamiętania:

  • kolejna nieostrożność związana z kodem – o czym warto pamiętać. Poległem na kodzie, w którym zadeklarowano wyrzucenie wyjątku IOException. I o ile na pytanie odpowiedziałem poprawnie, to nie zauważyłem myku, na który we wstępie do podręcznika autorzy zwracają uwagę. Otóż jeżeli listing programu zaczyna się od linii numer 1, wówczas oznacza to fakt, iż widzimy całość przedstawionego kodu. Natomiast jeśli pierwsza linia w listingu jest większa niż 1, wówczas istnieje szansa, że coś z tym kodem jest nie tak. No i było nie tak, gdyż IOException należy zaimportować przed użyciem, bez tego sypie błędem, że nie znalazł klasy.
  • deklarowanie wyjątków przez metodę main – tak, tak. Metoda ta może zadeklarować wyrzucenie wyjątku!
  • rozszerzona pętla for – jest fajna, nietrudna, ale różni się jednyn małym szczegółem od swojej starszej siostry. Rozważmy taki kod:
    int x = 5;
    for( x = 2; x < 10; x++) { }

    Skompiluje się on i będzie super pięknie i ładnie. Jednakże taki kod:
    int[] x = {2,3,4};
    int y = 0;

    for( y : x) {}

    nie skompiluje się. Pierwszy operand w tej wersji pętli musi być zadeklarowany w jej ciele.

  • nieskończone pętle nie muszą wysypywać stosu – rzecz teoretycznie kontrowersyjna. Kod:

    for(int i = 0; i < 10; i++) {
    if( i == 9 ) i = 1;
    }

    to oczywiście pętla nieskończona (zawiesiła mi NetBeansa). Jednakże nie doprowadzi do wygenerowania StackOverflowError!!. Jednakże takie coś:
    public void zrobCos() {
    zrobCos();
    }

    wywołane przez instancję obiektu doprowadzi do przepełnienia stosu, gdyż każde wywołanie metody rezerwuje trochę pamięci. W ten sposób moje nowe 2GB RAMu poleciały bardzo szybko i sypnęło błędem.

  • drugi operand asercji – służy temu, aby dorzucić do błędu asercji informację o tym, gdzie i co się wysypało. Jakoś ubzdurało mi się, że podane tam rzeczy muszą ostatecznie skutkować w obiekcie String. Okazało się, że to nie tak – wystarczy, że zwracane jest cokolwiek.
  • overriding metod – ta informacja była podana w rozdziale bodajże drugim, ale kto by się wtedy tym przejmował 🙂 Otóż jeśli metoda nadpisuje metodę ze swej klasy rodzicielskiej, nie może deklarować wyrzucenia szerszego wyjątku! Czyli jeśli metoda zrobCos() w klasie A deklaruje, że wyrzuci wyjątek IOException, wówczas dziedzicząca po klasie A klasa B nie może nadpisać metody zrobCos() deklarujac, ze wyrzuci ona po prostu zwykły Exception.

To tyle na dziś. Poinformuję tylko o bardzo ciekawej inicjatywie, której autorem jest Mariusz Lipiński, a którą można znaleźć pod wielce mówiącym adresem. Inicjatywa warta wspierania.

Advertisements

2 thoughts on “SCJP, podejście piąte

  1. Mateusz

    StackOverflowError to nie efekt nieskończonej pętli, to efekt nadmiernej ilości wywołanych metod. Każde wywołanie metody odkłada na stosie obecny stan, tak aby aplikacja po zakończeniu mogła powrócić do wcześniejszego wykonania. Tak więc jak będziesz wywoływał metody odpowiednio dużą ilość razy to też dostaniesz ten błąd, niekoniecznie wykorzystując przy tym pętlę.

    A co do inicjatywy Mariusza to faktycznie jest super. Sam do egzaminu uczyłem się z jego notatek 🙂

  2. chlebik Post author

    Z tego co pamietam Mariusz ma jutro wystapienie na WJUGu. O ile nic nieoczekiwanego nie nastapi to sie wybieram 🙂

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s