If and switch
- Jedynym dozwolonym wyrażeniem w bloku if jest wyrażenie zwracające wartość boolowską czyli typ
boolean, innymi słowy musi być to wyrażenie którego wartość wynikowa daje jedną z wartościbooleanlubBoolean - Należy uważać na przypisywanie wartości (=) zamiast znaku testującego (==) i zwracającego boolowską wartość
boolean x = false; if (x = true) {} // mamy przypisanie więc x zawsze będzie true - Nawiasy klamrowe nie są konieczne dla if'a, wtedy czytana jest tylko pierwsza linia wyrażenia warunkowego
- switch może przyjmować tylko
enum, byte, short, int, charNie możemy np.
long s = 30; switch(s) { } // lub patrzymy na zasięg byte b = getValue(); switch () { case 1: break; // da blad, jestesmy po za zakresem byte case 128: break; } - Stała
casezmienna musi być stała niezmienna, wliczając w to enum, niemożna mieć wartości zmiennych, czy też zakresu wartości - Jeżeli zmienna w warunku switch'a pasuje do jakiejś stałej wartości case'a, wykonanie nastąpi od momentu dopasowania case'a i przejdzie przez całe wyrażenie switch'a, aż natrafi na
breakinnymi słowy jeżeli nie ma w bloku case'a break'a to nie będzie to jedyny blok case'a jaki zostanie wykonany defaultjest używany do przechwytywania wartości nie zamieszczonych w case'ach, zostanie on wykonany jeżeli zmienna nie znajdzie dopasowania w case'ach.defaultblok może być umieszczony wszędzie w bloku switch'a, i jeśli ten blok nie zawiera break'a to kod będzie kontynuował wykonanie aż do zakończenia switch'a
Pętle (Loops)
- Podstawowa pętla
forzawiera trzy części: deklaracje, i/lub inicjalizacja, warunkową, i wyrażenie iteracyjne - Jeżeli zmienna jest oceniana lub też zwiększana lub zmniejszana w pętli
formusi być zdeklarowana przed pętlą, lub też w części pętli przeznaczonej do deklaracji zmiennej. - Zmienna zdeklarowana w pętli lub przy deklaracji pętli nie będzie widoczna po za nią.
- Można inicjalizować więcej niż jedna zmienną tego samego typu w pierwszej części pętli, każda inicjalizacja musi być oddzielona przecinkiem.
- Pętla eachfor posiada dwie części, deklaracje i wyrażenie. Jest używana do przeglądania tablic i kolekcji
- W pętli eachfor wyrażeniem jest tablica lub kolekcja którą chcemy przeglądać
- W pętli eachfor deklaracja to inaczej zmienna która ma zasięg tylko w tym bloku, zmienna ta trzyma wartość danego elementu dla danej iteracji
- Niemożna używać liczb lub też niczego innego co nie nie jest typu
booleandla konstrukcji if lub pętli. Niemożna np. powiedzieć żeif(x)chyba, że x jest typu boolean - Pętla do-while pozwala wejść przynajmniej jeden raz, nawet jeżeli test warunku zwraca false
Komendy break and continue
- Komenda
breakbez etykiety przerwie wykonywanie iteracji danej pętli, i uruchomienie pierwszej lini zaraz za pętlą continuebez etykiety powtarza wykonanie danej iteracji od momentu wystąpienia w pętli oczywiście jeśli warunek pętli na to pozwalabreak, continuez etykietą działają z tą samą zasadą z tym wyjątkiem, że odnoszą się do pętli oznaczonej tą etykietą
Obsługa wyjątków
- Wyjątki dzieli się na dwie klasy : checked i unchecked
- Wyjątki checked zaliczają się do tej klasy wszystkie podklasy klasy
Exception, nie wliczając w to klas które dziedziczą poRuntimeException - Wyjątki należące do klasy checked podlegają obsłużeniu albo zdeklarowaniu takiej reguły; jakakolwiek metoda która może rzucić wyjątek należący do grupy checked (wliczając to metody które wykonują metody które mogą rzucić taki wyjątek) muszą zadeklarować taki wyjątek używając słowa kluczowego
throws, lub też obsłużyć taki wyjątek odpowiednią konstrukcjatry/catch - Podklasy klas
Error or RuntimeExceptionnależą do grupy unchecked, więc kompilator nie wymusza ich deklarowania czy też obsługi. Można je deklarować lub też nie, kompilatorowi jest to bez różnicy, ale na ogól nie deklaruje się ani nie obsługuje się tej grupy wyjątków - Jeżeli używamy opcjonalnego bloku
finally, blok ten zawsze będzie wykonywany, bez znaczenia czy wyjątek został zgłoszony w bloku try czy tez nie. - Jedynym sposobem żeby blok
finallynie został wykonany jest wyłączenie JVM. To może nastąpić przez jeżeli kod z try lub catch wywoła metodęSystem.exit() - Blok
finallyrównież może zostać przerwany i nie oznacza to że wykona się on cały. Przerwanie może nastąpić np. jeżeli sam blok wywoła jakiś wyjątek lub też wywoła metodęSystem.exit() - Nie obsłużony prawidłowo wyjątek wyświetli stos wywołań, zaczynając od metody która wywołała wyjątek i kończąc na pierwszej metodzie która ma odpowiedni blok catch aby obsłużyć taki wyjątek, lub do wyłączenia JVM (co się zdarza jeżeli wyjątek dojdzie do metody main())
- Można samemu definiować swoje wyjątki, przeważnie poprzez użycie dziedziczenia po klasie
Exception, Twój wyjątek będzie wówczas należał do grupy checked i kompiler będzie wymuszał jego obsługe czy też deklarację. - Budując bloki catch należy pamiętać ze zaczyna się od najbardziej specyficznych kończąc na najbardziej ogólnych, ta kolejność musi być zachowana, Np. jeśli mamy do zdeklarowania dwa wyjątki IOException i Exception musimy IOException umieścić nad Exception w przeciwnym razie Exception będzie łapać wszystkie wyjątki jakie obsługuje klasa i jego podklasy, a że IOException jest jego podklasą umieszczenie go poniżej sprawia że nie będzie wywołany, kompilator zaś nie pozwala na deklarowanie wyjątków które nie mogą zostać wywołane
- Pewne wyjątki są tworzone przez programistów, i jakieś przez JVM
Pewna część drzewa dla hierarchii dziedziczenia wyjątków
java.lang.Throwable
|
|-- Error (unchecked)
| |
| |-- AssertionError
| |
| |--ThreadDeath
| |
| |--VirtualMachineError
| |
| |-- InternalError
| |
| |-- OutOfMemoryError
| |
| |-- StackOverflowError
| |
| |-- UnknownError
|
|-- Exception
|
|-- ClassNotFoundException
|
|-- CloneNotSupportedException
|
|-- IllegalAccessException
|
|-- InstantiationException
|
|-- InterruptedException
|
|-- NoSuchFieldException
|
|-- NoSuchMethodException
|
|-- RuntimeException (unchecked)
| |
| |-- ArithmeticException
| |
| |-- ArrayStoreException
| |
| |-- ClassCastException
| |
| |-- EnumConstantNotPresentException
| |
| |-- IllegalArgumentException
| | |
| | |-- IllegalThreadStateException
| | |
| | |-- NumberFormatException
| |
| |-- IllegalMonitorStateException
| |
| |-- IllegalStateException
| |
| |-- IndexOutOfBoundsException
| | |
| | |-- ArrayIndexOutOfBoundsException
| | |
| | |-- StringIndexOutOfBoundsException
| |
| |-- NegativeArraySizeException
| |
| |-- NullPointerException
| |
| |-- SecurityException
| |
| |-- TypeNotPresentException
| |
| |-- UnsupportedOperationException
|
|-- java.io.IOException
Mechanizm Asercji
- Asercja daje nam możliwość testowania naszych założeń podczas tworzenia kodu
- Asercja zazwyczaj jest włączona podczas testowania, ale wyłączona podczas wdrażania aplikacji
- Od Javy 1.4 można używać słowa kluczowego
assert, Jeżeli użyjemy assert dla nazwy zmiennej lub metody musimy skompilować plik używając komendy -source 1.3 dla javac - Asercja jest wyłączona domyślnie podczas wykonywania. Aby włączyć używa się flagi w linii komend -ea lub -enableassertions
- Selektywnie wyłączenie asercji wykonuje się poprzez użycie flagi -da lub -disableassertions
- Jeżeli użyjemy tych flag bez żadnych argumentów, to wyłączamy lub włączamy asercje ogólnie, można łączyć włączniki aby mieć asercje dla wybranych klas lub pakietów albo żeby nie mieć
- Można włączać i wyłączać asercje na wybranych klasach używając następującego polecenia:
javac -ea -da:MyClass TestClass
- Można również włączać i wyłączać asercje dla pakietów, pakiet po pakiecie, jakikolwiek pakiet zdefiniujemy jego pod pakiety również są liczone
- Nie należy używać asercji do sprawdzania argumentów metod publicznych.
- Nie należy używać asercji gdzie może spowodować tak zwany side effects. Asercja niema gwarancji wywołania, a my zapewne nie chcemy zachowania zależnego od tego czy asercja jest włączona czy też nie, przykład side effect
void process(int index) { assert(index++ > 0); /* side effect */ /* ... */ } // rozwiązanie void process(int index) { assert(index > 0); /* no side effect */ ++index; /* ... */ } - Można używać asercji, nawet dla metod publicznych, do sprawdzania czy dany blok nigdy nie będzie wykonywany poprzez np.
assert false;dla kodu który nigdy nie powinien zostać wykonany, więc jeśli dany kod zostanie wykonany zostanie rzucony natychmiast wyjątek a dokładniej błądjava.lang.AssertionError
SCJP 6 exam

Brak komentarzy:
Prześlij komentarz