-1-1. Wyjątki 2. Przykładowe zadania Wyjątki Wyjątek w Java jest obiektem, który opisuje sytuację błędną powstałą w kodzie. Zaistnienie sytuacji błędnej w metodzie powoduje utworzenie obiektu reprezentującego wyjątek i zgło-szenie go przez metodę, w której błąd wystąpił. Następnie metoda może sama obsłużyć wyją-tek lub przesłać go do obsługi przez inne metody/obiekty. Wyjątki mogą być zgłaszane przez maszynę wirtualną Javy lub przez kod użytkownika. Wyjąt-ki zgłaszane przez maszynę wirtualną są związane z tzw. błędami fatalnymi, natomiast zgła-szane przez użytkownika z błędami związanymi z logiką programu. Składnia programu obsługującego wyjątki bazuje na pięciu słowach kluczowych: try, catch, throw, throws i finally. Monitorowany kod znajduje się w bloku try. Zgłoszenie wyjątku wewnątrz bloku try powoduje powstanie obiektu-wyjątku i jego ewentualne przejęcie przez odpowiedni blok catch. try //monitorowany blok kodu catch (ExceptionType1 exob) // to się wykona, jeżeli zostanie zgłoszony wyjątek typu ExceptionType1 catch (ExceptionType2 exob) // to się wykona, jeżeli zostanie zgłoszony wyjątek typu ExceptionType2 finally //kod wykonywany po zakończeniu blokówtry i catch; służy do zwalniania zasobów Wprowadzanie danych z klawiatury. Wyjątki związane z wprowadzaniem danych, przekroczeniem rozmiaru tablicy, dzieleniem przez zero itd. Przykład użycia - : int a,b,c; String s; try //w bloku try umieszcza się instrukcje, //które mogą spowodować wyjątek a=b/c; //jeśeli c=0 zostanie zgłoszony wyjątek AritmeticException s=integer.tostring(a); catch (AritmeticException e) //wyjatek jest obsługiwany w bloku catch s="*";
-2- Java posiada wbudowane wyjątki obsługujące najczęściej spotykane błędy. Jednak często zacho-dzi potrzeba zdefiniowania nowych wyjątków specyficznych dla naszego programu. Utworzenie nowej klasy wyjątku jest proste. Wystarczy zdefiniować klasę dziedziczącą po klasie Exception. Nowo zdefiniowana klasa nie musi nawet niczego implementować, ale może. Przykłady: 1. Program, umożliwiający wypisanie podanego przez użytkownika elementu tablicy, w którym może zaistnieć odwołanie się do nieistniejącego elementu tablicy import java.util.*; public class Odczyt public static void main(string[] args) int tab[] = 1,2,3,4,5; Scanner odczyt = new Scanner(System.in); int index = -1; System.out.println("Podaj indeks tablicy, który chcesz zobaczyć: "); index = odczyt.nextint(); try System.out.println(tab[index]); catch (ArrayIndexOutOfBoundsException e) System.out.println("Zły parametr, rozmiar tablicy to:"+tab.length()); 2. Wprowadzanie danych z klawiatury z wykorzystaniem obiektu klasy Buffered Re-ader. /* Program czytający pojedynczą linię ze standardowego wejścia i wypisujący ją na ekran */ import java.io.*; public class IOExample1 public static void main(string args[]) throws IOException /* poniżej newralgiczna część programu. Klasa InputStreamReader reprezentuje "uchwyt" do strumienia wejściowego, zaś klasa BufferedReader pozwala na czytanie buforowane. * */
-3- BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Podaj tekst: "); System.out.flush(); //przed wczytaniem opróżniamy buforwyjściowy System.out.println(stdin.readLine()); 3. Wprowadzanie danych z klawiatury, zastosowanie obiektu klasy Scanner. Dzielenie przez liczbę wprowadzoną przez użytkownika import java.util.scanner; public class Main public static void main(string[] agrs) throws ArithmeticException int x=10; int y=1; Scanner sc = new Scanner(System.in); System.out.print("Podaj dzielnik: "); try y = sc.nextint(); catch (InputMismatchException e) System.out.println("Niewłaściwy typ danych"); if(y==0) throw new ArithmeticException("Nie mozna dzielić przez 0"); else System.out.println(x/(double)y); 4. Program z obsługą wyjątków wejścia/wyjścia, niewłaściwego formatu danych i przekroczeniem zakresu tablicy import java.io.*; public class Odczyt public static void main(string[] args) int tab[] = 1,2,3,4,5; BufferedReader odczyt = new BufferedReader(new InputStreamReader(System.in)); int index = -1; System.out.println("Który element tablicy chcesz zobaczyć: "); boolean czypoprawne = false; while(!czypoprawne) try index = Integer.parseInt(odczyt.readLine());
-4- catch (NumberFormatException n) System.out.println("Niepoprawne dane! " +"\n Który element tablicy chcesz zobaczyć: "); catch (IOException e) System.out.println("Błąd odczytu danych"); czypoprawne = index == -1? false : true; Zadanie 1. try System.out.println(tab[index-1]); catch (ArrayIndexOutOfBoundsException e) System.out.println("Niepoprawny parametr, rozmiar tablicy to:"+tab.length); Utwórz klasę Punkt. Klasa powinna zawierać: składowe prywatne typu całkowitego - współrzędne punktu na płaszczyźnie konstruktor bezargumentowy inicjujący dowolne wartości początkowe punktu konstruktor z argumentami- współrzędne punktu mmetodę publiczną - zwracającą współrzędną x metodę publiczną - zwracającą współrzędną y metodę publiczną wyzeruj(), metodę publiczną przesun(int,int), a) Napisz program (czyli klasę publiczną np. Geometria) i stwórz w nim obiekt klasy Punkt, wypisz jego współrzędne, przesuń go i sprawdź, czy zmieniły się jego współrzędne wypisz współrzedne. b) Utwórz n-elementową tablicę punktów, których współrzędne będą generowane losowo i wypisz ich współrzędne. c) Utwórz n-elementową tablicę punktów, których współrzędne będą podane przez użytkownika, wczytaj parametry wektora o jaki przesuniesz punkty, wypisz współrzędne punktów po przesunięciu. W przypadku wpisania z klawiatury niepoprawnych wartości program rzuca wyjątek, który należy obsłużyć w programie poprzez wypisanie komunikatu o niepoprawnie podanych danych. Współrzędne punktów i wektora przesunięcia muszą być liczbami, przy czytaniu danych przy pomocy obiektu klasy Scanner - wyjątek InputMismatchException. Zadanie 2. Zaimplementuj stos z wykorzystaniem tablicy. Zdefiniuj klasę stos o prywatnych składowych klasy: Rozmiar tablicy Tablica elementów Indekswierzchołka stosu Zdefiniuj metody: Konstruktor bez argumentów, przypisuje wartości składowym klasy, generuje losowo ilość elementów tablicy Konstruktor z argumentem, przypisuje wartości składowym klasy maxrozmiarstosu() zwraca rozmiar tablicy rozmiarstosu() zwraca aktualną liczbę elementów na stosie nastos() dodaje element na stos losowo generowana liczba i wypisuje dodawany na stos element zestosu() zdejmuje element ze stosu i wypisuje zdejmowany element wypiszstos() wypisuje stos
-5- W przypadku usunięcia elementu z pustego stosu lub przy dodaniu do pełnego stosu kolejnego elementu program wyrzuca wyjątek, który należy obsłużyć w programie poprzez wypisanie odpowiedniego komunikatu. Odwołanie do elementu o niewłaściwym indeksie wyjątek ArrayIndexOutOfBoundsException Zadanie 3. Zdefiniuj klasę kolo, która powinna zawierać: Prywatne składowe klasy: promień koła - typ float kolor wypełnienia -typ int Konstruktor bezargumentowy inicjujący wartości początkowe własciwości koła (dowolnie ustaloną) konstruktor kopiujący z argumentem typu Kolo konstruktor z argumentami: promień, kolor wypełnienia Metody publiczne: obliczpole(), obliczająca pole powierzchni koła ustawpromien(float), zmieniająca promień koła ustawkolor(int), zmieniającą kolor koła funkcję porownajkola(kolo B), porównującą, czy dwa koła mają taką samą powierzchnię i kolor. Uruchom w programie głównym sekwencję instrukcji dla dwóch obiektów K1, K2: konstruktor bezparametrowy, konstruktor z parametrami; porównanie kół, ustawienie koloru ustawienie promienia porównanie kół. d) Wczytaj z klawiatury dane potrzebne do utworzenia nowych obiektów. e) Użyj konstruktora z argumentami dla obiektów K3, K4 i konstruktora kopiującego obiekt K3 przy tworzeniu obiektu K5. f) Porównaj utworzone obiekty W przypadku wpisania z klawiatury niepoprawnych wartości program wyrzuca wyjątek, który należy obsłużyć w programie poprzez wypisanie komunikatu o niepoprawnie podanych danych. Promień koła musi być liczbą dodatnią. Zadanie 4 Napisz klasę Student o prywatnych składowych: nazwisko, wiek ocena1, ocena2 Metodach konstruktorze bez argumentów konstruktor z argumentami konstruktor kopiujący srednia(), wypisz() - wypisująca nazwisko, wiek, obie oceny i średnią z tych ocen. a) W klasie publicznej Uczelnia utwórz studenta, przypisz mu nazwisko, wiek, jakieś oceny i wypisz jego dane. W przypadku wpisania z klawiatury niepoprawnych wartości program wyrzuca wyjątek, który należy obsłużyćw programie poprzez wypisanie komunikatu
-6- o niepoprawnie podanych danych. Wpisywany wiek musi byd liczbą w zakresie [17, 80]. nazwisko musi posiadać minimum 3 znaki, oceny musza byc liczbami z zakresu [2,5]. b) W klasie Student zdefiniuj metodę wstawocena(float), która będzie wstawiać oceny w pole ocena1 i nie pozwoli, żeby została wpisana liczba większa od 5 lub mniejsza od 2.. c) Do klasy Student dopisz przeciążoną (dwuargumentową) metodę wstawocena, która pozwoli wstawić oceny w oba pola ocena1, ocena2 w jednym wywołaniu, z zachowaniem poprawności danych. d) Do klasy Student dopisz przeciążoną (dwuargumentową) metodę srednia, która pozwoli obliczyć średnia ważoną, wagi ocen podane jako argumenty funkcji. g) Napisz program, który wczytuje z konsoli nazwisko i dwie oceny, tworzy na podstawie tych danych obiekt klasy Student i wypisuje jego średnią (używając odpowiedniej metody obiektu). h) Zmodyfikuj poprzednie zadanie tak, aby można było wczytać dane wielu studentów. Użyj tablicy obiektów. W przypadku wpisania z klawiatury niepoprawnych wartości program wyrzuca wyjątek, który należy obsłużyć w programie poprzez wypisanie komunikatu o niepoprawnie podanych danych. Oceny muszą być liczbami z przedziału [2,5], nazwisko musi mieć minimum 3 znaki, wiek z przedziału [17,80]. Zadanie 5 Zaimplementuj klasę Wielomian, reprezentującą wielomian n- tego stopnia o współczynnikach całkowitych, z odpowiednimi konstruktorami, operacjami dodawania, odejmowania, mnożenia oraz wypisywaniem. Napisz metodę, która pobierze wartość zmiennej X z klawiatury i obliczy wartość wielomianu. Jeżeli wartość ta będzie większa od 100 to program wyrzuci zdefiniowany w programie wyjątek. Zadanie 6 Dane są dwie tablice o rozmiarach n oraz m. Napisz metody, które pozwolą wypełnić te tablice losowo wygenerowanymi danymi z zakresu [1,5]. Napisz metodę która wypisze liczność elementów zawartych w sumie w obu tablicach. Jeżeli liczność wynosi 1 lub 2 to program wyrzuci wyjątek. Zadanie 7 Napisz program, który pobiera od użytkownika pięć dat w formie DD.MM.YYYY, następnie sortuje je niemalejąco. Jeżeli wpisania przez użytkownika data dotyczy dnia po 10.03.2017 to program wyrzuca wyjątek.