java- wykład 4 · 2015. 10. 29. · 3 wyjĄtki wykonywane są kolejne instrukcje bloku try. jeśli...

32
JAVA- wykład 4 Wyjątki Operacje na napisach (klasy String, StringTokenizer, StringBuffer, StringBuilder ) Treści prezentowane w wykładzie zostały oparte o: Barteczko, JAVA Programowanie praktyczne od podstaw, PWN, 2014 http://docs.oracle.com/javase/8/docs/ C. S. Horstmann, G. Cornell, Java. Podstawy, Helion, Gliwice 2008

Upload: others

Post on 06-Mar-2021

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

JAVA- wykład 4

WyjątkiOperacje na napisach (klasy String, StringTokenizer, StringBuffer, StringBuilder )

Treści prezentowane w wykładzie zostały oparte o:● Barteczko, JAVA Programowanie praktyczne od podstaw, PWN, 2014● http://docs.oracle.com/javase/8/docs/● C. S. Horstmann, G. Cornell, Java. Podstawy, Helion, Gliwice 2008

Page 2: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

2

WYJĄTKI

Wyjątek - to sygnał o błędzie w trakcie wykonania programu

● Wyjątek powstaje na skutek jakiegoś nieoczekiwanego błędu.

● Wyjątek jest zgłaszany (lub mówiąc inaczej - sygnalizowany).

● Wyjątek jest (może lub musi być) obsługiwany.

Prosty schemat obsługi wyjątków

try { // ... w bloku try ujmujemy instrukcje, //które mogą spowodować wyjątek } catch(TypWyjatku exc) { //w klauzuli catch umieszczamy obsługę wyjątku } catch (TypWyjatku2 exc) {

//obsługa wyjątków TypWyjatku2

} catch (TypWyjatku3 w) {

//obsługa wyjątków TypWyjatku3 } ...

Page 3: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

3

WYJĄTKI● Wykonywane są kolejne instrukcje bloku try.

● Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie bloku try jest przerywane w miejscu wystąpienia błędu.

● Sterowanie przekazywane jest do pierwszej w kolejności klauzuli catch, w której podana w nawiasach okrągłych po słowie catch klasa wyjątku pasuje do typu powstałego wyjątku. Inne klauzule catch nie są wykonywane.

● Stąd ważny wniosek: najpierw podawać BARDZIEJ SZCZEGÓŁOWE TYPY WYJĄTKÓW np. najpierw FileNotFoundException, a później IOException, bo klasa FileNotFoundException jest pochodna od IOException

● Obsługująca wyjątek klauzula catch może zrobić wiele rzeczy: m.in. zmienić sekwencję sterowania (np. poprzez return lub zgłoszenie nowego wyjątku za pomocą instrukcji throw). Jeśli nie zmienia sekwencji sterowania, to wykonanie programu jest kontynuowane od następnej instrukcji po bloku try.

Page 4: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

4

WYJĄTKI

PRZYKŁAD. Przypadek braku jawnej obsługi wyjątku dzielenia przez 0

public class NoCatch { public static void main(String[] args) {

int a = 1, b = 0, c = 0;

c = a/b;

System.out.println(c); }}

- powstały błąd (wyjątek) powoduje zakończenie programu, a JVM wypisuje komunikat o jego przyczynie:

Exception in thread "main" java.lang.ArithmeticException: / by zero at NoCatch.main(NoCatch.java:6)

Page 5: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

5

WYJĄTKIPRZYKŁAD 2. Obsługa wyjątku ArithmeticException - zabezpieczenie się przed możliwymi skutkami całkowitoliczbowego dzielenia przez zero

public class Catch1 { public static void main(String[] args) {

int a = 1, b = 0, c = 0;

String wynik;

try {

c = a/b;//spowoduje powstanie wyjątku

wynik = "" + c;

} catch (ArithmeticException exc) {

wynik = "Dzielenie przez zero"; }

System.out.println(wynik);

}}

Page 6: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

6

WYJĄTKI

● Typowym przykładem obsługi wyjątków jest weryfikacja wprowadzanych przez użytkownika danych. W omawianych przykładowych programach żądaliśmy od użytkownika wprowadzania liczb całkowitych, a następnie za pomocą metody parseInt przekształcaliśmy ich znakową reprezentację na binarną. Jak wiemy, jeśli przy tym wprowadzony napis nie reprezentuje liczby całkowitej, to powstaje wyjątek NumberFormatException. Powinniśmy go zawsze obsługiwać.

● Możemy więc teraz zmodyfikować np. program wykonywania operacji arytmetycznych na liczbach całkowitych:

try {

int num1 = Integer.parseInt(snum1); //operacje na num1 } catch (NumberFormatException exc) {

//obsługa wyjątku }

Page 7: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

7

WYJĄTKI -przykład

public class CatchTest { public static Integer pobierzInteger() { String wynik; while((wynik = javax.swing.JOptionPane.showInputDialog( "Podaj liczbę całkowitą"))!=null) { try { return Integer.parseInt(wynik); } catch(NumberFormatException exc) {} } return null;//Anulowano }

public static void main(String[] args) {

Integer i = pobierzInteger(); if (i == null) System.out.println("Anulowano"); else System.out.println("Podano: " + i); }}

Page 8: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

8

WYJĄTKI

● Wyjątki są obiektami klas wyjątków.

● Zatem nazwy np. NumberFormatException są nazwami klas, a zmienna exc zawiera referencję do obiektu odpowiedniej klasy wyjątku. Wobec tej zmiennej możemy użyć licznych metod klas wyjątków np.

– getMessage()- zwraca napis - informację o wyjątku

– toString() - zwraca napis - informację o wyjątku (zazwyczaj nazwę klasy + dodatkowe informacje uzyskane przez getMessage())

– printStackTrace()- wypisuje na konsoli informacje o wyjątku oraz sekwencje wywołań metod, które doprowadziły do wyjątku (stos wywołań)

– getCause() - zwraca wyjątek niższego poziomu, który spowodował powstanie wyjątku lub null w przeciwnym razie

Page 9: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

9

WYJĄTKI

● W Javie zdefiniowanych jest wiele typowych wyjątków (najważniejsze są w pakiecie java.lang). Są one używane przez klasy ze standardowych bibliotek. Różnią się jedynie nazwą, która pozwala zorientować się co dany wyjątek oznacza. W swoich aplikacjach można korzystać z tych klas lub zdefiniować nowe, pasujące do konkretnego zastosowania. Wszystkie klasy, których egzemplarze mogą być zgłoszone jako wyjątek muszą dziedziczyć po klasie Throwable.

● Throwable ma dwie bezpośrednie podklasy Error i Exception. Wyjątki dziedziczące po Error reprezentują poważne problemy, których aplikacja nie będzie w stanie rozwiązać. Przykładową podklasą jest VirtualMachineError. Wystąpienie takiego wyjątku oznacza, że maszyna wirtualna nie może dalej kontynuować pracy, np. z powodu wyczerpania się zasobów systemowych. Wyjątków rozszerzających Error nie należy przechwytywać, gdyż nie ma możliwości zaradzenia sytuacjom wyjątkowym, które je spowodowały.

Page 10: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

10

WYJĄTKI – Klasa Exception● Wyjątki dziedziczące po Exception reprezentują sytuacje, na które

aplikacja powinna być przygotowana. Jej przykładowe podklasy to:

– IOException, która reprezentuje sytuacje wyjątkowe związane z wejściem/wyjściem,

– ClassNotFoundException, która wskazuje, że maszyna wirtualna nie odnalazła klasy o nazwie podanej jako napis.

● Ciekawą podklasą Exception jest RuntimeException. Wyjątki rozszerzające RuntimeException mogą wystąpić podczas typowych operacji, jak rzutowanie zmiennej, odwołanie się do elementu tablicy lub odwołanie się do składowej obiektu. Ich wystąpienie zazwyczaj oznacza, że programista popełnił błąd w swoim kodzie. JVM wykrywa wystąpienie takich błędów w trakcie działania programu i informuje o tym, zgłaszając odpowiedni wyjątek. Mimo, że takie wyjątki też można obsługiwać, zdecydowanie lepiej jest zadbać, żeby się nie pojawiały. Ze względu na swoją wszechobecność ich pełna obsługa praktycznie mijałaby się z celem.

Page 11: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

11

WYJĄTKI● Wyjątki pochodne od klas RuntimeException i Error są

niekontrolowane – nie muszą być obsługiwane.

● Pozostałe wyjątki są kontrolowane, co oznacza, że: metody zgłaszają wyjątki wymienione jawnie w swojej klauzuli throws (ew. podklasy tych wyjątków). Wówczas odwołania do tych metod wymagają jawnej obsługi ewentualnie zgłaszanych wyjątków poprzez konstrukcje try – catch lub poprzez wymienienie wyjątku w klauzuli throws naszej metody (tej która odwołuje się do metody, która może zgłosić wyjątek) i "przesunięcie" obsługi wyjątku do miejsca wywołania naszej metody.

● Zatem wiele razy natkniemy się na sytuację, w której musimy obsługiwać wyjątki, które mogą powstać przy wywołaniu jakichś metod ze standardowych klas Javy. Jeśli tego nie zrobimy, kompilator wykaże błąd w programie. Sytuacja taka dotyczy, np. metod ze standardowego pakietu java.io, zawierającego klasy do operowania na strumieniach danych (m.in. plikach).

● Deklaracja throws TypWyj1, TypWyj2,..., TypWyjNużywana w nagłówku metody, konstruktora, oznacza że dana metoda może zgłaszać wyjątki podanych typów:public void metoda() throws InterruptedException{// ciało metody- tu może powstać wyjątek}

Page 12: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

12

KLAUZULA FINALLYKlauzula finally służy do wykonania kodu niezależnie od tego czy wystąpił wyjątek czy nie.boolean metoda(...) {

try { // instrukcje, które mogą spowodować wyjątek } catch(Exception e) { return false; }

finally {

// posprzątanie, np. zamknięcie pliku } return true; }Jeśli powstał wyjątek - wykonywana jest klauzula catch. Mimo, iż zmienia ona sekwencję sterowania (zwraca false na znak, iż nastąpiło niepowodzenie), sterowanie przekazywane jest do klauzuli finally. I dopiero potem zwracany jest wynik - false. Jeśli nie było wyjątku, po zakończeniu instrukcji w bloku try sterowanie od razu wchodzi do klauzuli finally, a po jej zakończeniu zwracany jest wynik true (wykonywana jest ostatnia instrukcja metody). Dopuszczalna jest forma try bez catch, ale z finally.

Page 13: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

13

multicatch

● Wprowadzony w Javie 7 mulitcatch upraszcza obsługę wyjątków. Zamiast:

try { //kod, w którym może powstać jeden z wyjątków //TypExc1, TypExc2}catch (TypExc1 exc){ func();}catch (TypExc2 exc){ func();}

możemy zapisać jedną klauzulę catch dla kilku typów wyjątków

try{ //kod, w którym może powstać jeden z wyjątków //TypExc1, TypExc2}catch (TypExc1 | TypExc2 exc){ func();}

Oczywiście, ma to sens wtedy, gdy obsługa wyjątków TypExc1 , TypExc2 jest taka sama i nie da się jej wyrazić poprzez przechwycenie wyjątku wspólnej nadklasy.

Page 14: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

14

try-with-resources

Podobnie, od Javy 7 zamiast pisać:

FileInputStream in = new FileInputStream("plik"); try { FileOutputStream out = new FileOutputStream("cel"); try { //Działanie na "in" i "out" } finally { out.close(); } } finally { in.close(); }

dla obiektów klas implementujących interfejs AutoCloseable (np. klasy FileInputStream i FileOutputStream), można użyć konstrukcji "try-with-resources":

try (FileInputStream in = new FileInputStream("plik"); FileOutputStream out = new FileOutputStream("cel")) { //Działanie na "in" i "out"}

Page 15: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

15

WŁASNE WYJĄTKI

Aby stworzyć własny wyjątek należy zdefiniować odpowiednią klasę dziedziczącą po klasie Exception:

class NaszWyj extends Exception {…}

Zwykle w naszej klasie wystarczy umieścić dwa konstruktory: bezparametrowy oraz z jednym argumentem typu String (komunikat o przyczynie powstania wyjątku). W konstruktorach tych należy wywołać konstruktor nadklasy (za pomocą odwołania super(...), w drugim przypadku z argumentem String).

Jeśli jakaś nasza metoda ma sygnalizować wyjątek NaszWyj - musi podać w deklaracji, że może to zrobić:

void naszaMetoda() throws NaszWyj

a następnie sprawdza warunki powstania błędu i jeśli jest błąd - tworzy wyjątek (new NaszWyj(...)) i sygnalizuje go za pomocą instrukcji throw :

throw new NaszWyj(ew_param_konstruktora_z_info_o_błędzie)

Page 16: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

16

WŁASNE WYJĄTKIclass NaszWyjatek extends Exception { NaszWyjatek() {super();} NaszWyjatek(String s) { super(s); }}

public class NaszaKlasa { … public void metoda() throws NaszWyjatek { … throw new NaszWyjatek("Jakaś przyczyna"); … } …}-------------------------------------------------public class NowyWyjatekTest { public static void main(String[] args) { NaszaKlasa obj = new NaszaKlasa(); try { obj.metoda(); } catch (NaszWyjatek w) { System.out.println(w.getMessage()); //nadklasa Throwable, definiuje metodę getMessage(), //przy pomocy której można wydobyć napis z wyjątku } }}

Page 17: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

17

Klasa String● W klasie String znajdziemy wiele użytecznych metod przeznaczonych do

operowania na łańcuchach znakowych.

● Kolejne znaki napisów występują na pozycjach, które są indeksowane od 0.

● Części napisów (łańcuchów znakowych) określa się terminem "podłańcuch" (substring).

● Obiekty klasy String są niemodyfikowalne (ang. immutable) - to znaczy napisów klasy String nie możemy zmieniać (np. do napisu dodać inny). W wielokrotnie używanej przez nas konkatenacji łańcuchów wynikowy napis, powstający z dodania do łańcucha znakowego innego napisu, jest nowym obiektem i np. w takiej sekwencji:String s = "Ala";s = s + " ma kota";tworzony jest nowy obiekt, zawierający napis "Ala ma kota" i referencja do niego przypisywana jest zmiennej s, która poprzednio zawierała referencję do napisu "Ala".

● Zwróćmy też uwagę, że w klasie String nie ma żadnych metod pozwalających modyfikować istniejący obiekt-napis.

Page 18: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

18

Klasa String -wybrane metody

Poniżej przedstawimy kilka wybranych metod. Większość metod (wszystkie metody niestatyczne) używana jest "na rzecz" obiektów klasy String; o obiekcie na rzecz którego wywołano metodę mówimy ten napis.

● String(char[] c) – konstruktor, tworzy napis z tablicy znaków

● String(byte[] b) – konstruktor, tworzy napis z tablicy bajtów (używana jest domyślna strona kodowa do przekształcania bajtów na znaki)

● char charAt(int index) - zwraca znak na pozycji, oznaczonej indeksem index. Pierwsza pozycja ma indeks 0.

● int compareTo(String anotherString) - porównuje dwa napisy: ten (this) na rzecz którego użyto metody oraz przekazany jako argument. Metoda zwraca 0, gdy napisy są takie same. Jeżeli się różnią, to - gdy występują w nich różne znaki - zwracana jest wartość:this.charAt(k) - anotherString.charAt(k), gdzie k - indeks pierwszej pozycji, na której występuje różnica znaków. Jeżeli długość napisów jest różna (a znaki napisów są takie same w części określanej przez długość krótszego napisu) - zwracana jest różnica długości: this.length() - anotherString.length(). Oznacza to, że wynik jest ujemny, gdy ten (this) łańcuch poprzedza leksykograficznie (alfabetycznie) argument (anotherString) oraz dodatni - gdy ten łańcuch jest leksykograficznie większy od argumentu.

Page 19: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

19

Klasa String -wybrane metody● int compareToIgnoreCase(String str) - porównuje leksykograficznie

dwa napisy, bez rozróżnienia małych i wielkich liter.

● boolean endsWith(String suffix) - zwraca true, gdy napis kończy się łańcuchem znakowym podanym jako argument, false - w przeciwnym razie.

● boolean equals(Object anObject) - zwraca true, gdy anObject jest takim samym co do zawartości napisem jak ten napis; w każdym innym przypadku - zwraca false.

● boolean equalsIgnoreCase(String anotherString) - j.w. - ale bez rozróżniania małych i wielkich liter.

● byte[] getBytes() zwraca tablicę bajtów reprezentujących ten napis w domyślnej stronie kodowej

● int indexOf(String str) - zwraca indeks pozycji pierwszego wystąpienia w danym napisie napisu podanego jako argument str; jeżeli str nie występuje w tym napisie - zwraca -1

● int indexOf(String str, int fromIndex)- poszukuje pierwszego wystąpienia napisu str poczynając od pozycji oznaczonej przez indeks fromIndex; zwraca indeks pozycji na której zaczyna się str lub -1 gdy str nie występuje w tym napisie.

Page 20: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

20

Klasa String -wybrane metody

● int lastIndexOf(String str) - jak indexOf - ale zwracany jest indeks pozycji ostatniego wystąpienia.

● int length() - zwraca długość napisu.

● String replace(char oldChar, char newChar) - zwraca nowy obiekt klasy String, w którym zastąpiono wszystkie wystąpienia znaku oldChar na znak newChar.

● boolean startsWith(String prefix)- zwraca true, gdy napis zaczyna się podanym jako argument łańcuchem znakowym; false - w przeciwnym razie.

● String substring(int beginIndex) - zwraca podłańcuch tego łańcucha znakowego zaczynający się na pozycji o indeksie beginIndex (do końca łańcucha).

● String substring(int beginIndex, int endIndex) - zwraca podłańcuch tego łańcucha jako nowy obiekt klasy String. Podłańcuch zaczyna się na pozycji o indeksie beginIndex, a kończy (uwaga!) - na pozycji o indeksie endIndex-1. Długość podłańcucha równa jest endIndex - beginIndex.

Page 21: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

21

Klasa String -wybrane metody

● char[] toCharArray()- znaki łańcucha -> do tablicy znaków (typ char[]).

● String toLowerCase() - zamiana liter na małe.

● String toUpperCase() - zamiana liter na duże.

● String trim() - usuwa znaki spacji, tabulacji, końca wiersza itp. tzw. białe znaki z obu końców łańcucha znakowego. Zwraca wynik jako nowy łańcuch.

● static String valueOf(char c) - zwraca wartość typu char jako napis.

● static String valueOf(char[] data) - zwraca napis złożony ze znaków z tablicy.

● static String valueOf(double d) - zwraca znakową reprezentację liczby typu double.

● static String valueOf(int i) - zwraca znakową reprezentację liczby typu int.

Page 22: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

22

Klasa String● Uwaga. Zanim napiszemy fragment wykonujący określone zadanie na

napisach, sprawdźmy w dokumentacji czy w klasie String nie ma metod, które by nam to ułatwiły.

● Kiedy porównujemy jakieś napisy, to zwróćmy uwagę na

– Czy białe znaki (spacje, tabulacje) ewentualnie okalające napis są istotne w porównaniu; jeśli nie to użyjmy metody trim()

– Czy chcemy porównać napisy, uwzględniając wielkość liter; jeśli nie, to użyjmy metod equalsIgnoreCase lub ujednolićmy wielkość liter w napisach metodami toUpperCase()lub toLowerCase()

● Przykład. Użytkownik odpowiada w dialogu wejściowym na pytanie. Uwzględnijmy to, że może wprowadzić niepotrzebne spacje lub użyć różnej wielkości liter.String ans=JOptionPane.showInputDialog (”Czy mam wykonać program?”);if (ans != null){ ans=ans.trim().toUpperCase(); switch(ans){ case ”TAK”: case ”T” : execute(); }}

Page 23: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

23

String – metoda join

● W Javie 8 do klasy String dodano metody statyczne join(separator, zestaw_napisów),gdzie zestaw_napisów to albo argumenty-napisy oddzielone przecinkami, albo tablica napisów, albo kolekcja napisów. Metoda wstawia podany separator między elementy zestawu_napisów i zwraca tak utworzony String:

● Przykład: String res= String.join("-", "A", "B", "C"); System.out.println(res); //A-B-C int n=10; String[] stab = new String[n]; int sum=0; for (int i=1; i<=n; i++){ sum+=i; stab[i-1]=String.valueOf(i); } System.out.println(String.join("+",stab)+" = "+sum); //1+2+3+4+5+6+7+8+9+10 = 55

Page 24: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

24

String - przykład 1import javax.swing.*;

public class Wycieczki {

public static void main(String[] args) {

String[] dest = {"Bali", "Cypr", "Ibiza", "Kenia", "Kuba"};

double[] price = {5000, 2500, 2800, 4500, 6000};

String msg = "Wybierz kierunek - " +

" wpisując literę A-"+ (char) ('A'+dest.length-1)+ ":\n";

for (int i=0; i < dest.length; i++)

msg += (char) ('A' + i) + " - " + dest[i] + '\n';

String res;

while ((res = JOptionPane.showInputDialog(msg)) != null) {

if (res.length() == 0) continue;

int i = res.charAt(0) - 'A';

if (i < 0 || i >= dest.length) continue;

JOptionPane.showMessageDialog(null, dest[i] + " - cena: " + price[i]); } }}

Page 25: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

25

String - przykład 2public class ZnajdzAnd{public static void main(String[] args) { // Tekst do analizy String text = "To be or not to be, that is the question;" + " Whether 'tis nobler in the mind to suffer" + " the slings and arrows of outragous fortunę,"

+ " or to take arms against a sea of troubles," + " and by opposing end them?"; int licznikAnd = 0;// liczy wystąpienia and String andStr = "and"; // podłańcuch do wyszukania int index = text.indexOf(andStr); // pierwsze and while(index >= 0) { ++licznikAnd; index += andStr.length() ; //przeskocz do pozycji //po pierwszym znalezionym and index = text.index0f(andStr, index); } } System.out.println("Tekst zawiera " + licznikAnd + " and");}

Page 26: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

26

StringBuffer, StringBuilder

● Modyfikowalne obiekty-łańcuchy definiują klasy StringBuffer i StringBuilder

● Klasa StringBuilder ma takie same metody jak StringBuffer.

● Rożnica między klasami StringBuffer i StringBuilder polega tylko na tym, że pierwsza zapewnia synchronizację dostępu z równolegle wykonujących się fragmentów kodu (wątków), a wobec tego jest trochę mniej efektywna; jednak ta właściwość jest niezbędna w programowaniu współbieżnym.

● Zastosowanie klasy StringBuffer lub StringBuilder zamiast String jest wskazane przy dużej liczbie połączonych operacji konkatenacji, bo dzięki temu uzyskujemy wielokrotnie wyższą efektywność działania programu. (Przy naprawdę dużej liczbie – powyżej ok. 50 tys.-operacji np. w pętli, użycie klasy String i operatora + jest niedopuszczalne)

Page 27: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

27

StringBuffer, StringBuilder

Obiekty klasy StringBuffer oraz StringBuilder , to "bufory"-przydzielone fragmenty pamięci, które dynamicznie możemy wypełniać napisami. Łańcuch może też zajmować tylko część bufora. W szczególności możemy utworzyć pusty - na razie - bufor:

StringBuffer sb = new StringBuffer();

po czym wypełniać go zawartością dopisując do niego jakieś kolejne napisy:

sb.append("jakiś napis 1");sb.append(10);sb.append(new Para(1,2));

Metoda append zwraca StringBuffer, wobec tego możemy zapisać krócej

sb.append("jakiś napis 1").append(10).append(new Para(1,2));

Jeśli utworzyłeś już obiekt StringBuffer możesz sprawdzić jego długość metodą length() oraz pojemność metodą capacity().

Nie musisz przejmować się pojemnością bufora, w razie potrzeby zostanie ona automatycznie zwiększona.

Page 28: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

28

StringBuffer, StringBuilder● Możesz zdefiniować obiekt StringBuffer o zadanej pojemności startowej

StringBuffer tekstBufor = new StringBuffer(50);Domyślnie nowy obiekt StringBuffer mieści 16 znaków.

● Możesz też zmieniać długość obiektu StringBuffer. Jeśli mamyStringBuffer tekstBufor = new StringBuffer("Jakiś tekst");to po poleceniu

tekstBufor.setLength(5);

tekstBufor zawiera "Jakiś". Możemy wrócić do poprzedniej długości obiektu tekstBufor przez

tekstBufor.setLength(ll);

ale zawarty tam tekst już zginął. Nie wolno ustawiać ujemnej długości. Jeśli tak zrobisz zostanie zgłoszony wyjątek StringOutOfBoundsException,

● Obiekt klasy StringBuffer łatwo można przekształcić w obiekt klasy String za pomocą metody toString(): String s = sb.toString();

Page 29: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

29

StringBuffer, StringBuilder

● Do wstawiania łańcuchów do obiektów StringBuffer służy metoda insert() StringBuffer przyslowie=new StringBuffer("Bez pracy nie ma kołaczy"); przyslowie.insert(4,"dobrej ");wstawi poczynając od indeksu 4 łańcuch "dobrej ". Zatem przyslowie będzie zawierać "Bez dobrej pracy nie ma kołaczy". Ta wersja metody insert dopuszcza jako drugi argument dowolny z typów, które dopuszcza metoda append. Można też wstawiać tablice typu char[].

● StringBuffer zawiera metody charAt() i getChars(), które działają tak jak metody klasy String, Metoda charAt() pobiera znak z zadanej pozycji, a metoda getChars() pobiera ciąg znaków i umieszcza go w tablicy typu char poczynając od zadanej pozycji. Nie ma analogonu metody getBytes() dla obiektów StringBuffer,

● Możesz zmieniać konkretny znak na danej pozycji:przyslowie.setCharAt(2,"z");

● Możesz odwrócić kolejność znaków w łańcuchu:StringBuffer palindrom=new StringBuffer("wspak"); palindrom.reverse();//Wtedy palindrom zawiera "kapsw".

Page 30: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

30

Rozbiór tekstów - StringTokenizer

● Bardzo często w programowaniu występują sytuacje, gdy trzeba rozbić, rozłożyć jakiś tekst (napis) na poszczególne występujące w nim symbole (np. słowa, liczby).

● Do wyłuskiwania symboli z łańcuchów znakowych służy klasa StringTokenizer z pakietu java.util.

● Po to by dokonać rozbioru tekstu - tworzymy obiekt klasy StringTokenizer, podając jako argument konstruktora - tekst do rozbioru np.String expr = "21 + 21";StringTokenizer st = new StringTokenizer(expr);

● Ta postać konstruktora zakłada domyślnie, że separatorami są znaki z następującego zestawu " \t\n\r\f" (czyli znak spacji, tabulacji, przejścia do nowego wiersza, powrotu karetki, nowej strony). W tym przypadku symbolami będą ciągi znaków, które nie zawierają żadnego z wymienionych separatorów

Page 31: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

31

Rozbiór tekstów - StringTokenizer

● Obiektu klasy StringTokenizer możemy teraz zapytać o to ile elementów zawiera przekazany konstruktorowi napis: int n = st.countTokens(); // n = 3

● Wyłuskiwanie elementów odbywa się sekwencyjnie poczynając od początku łańcucha. Służy temu metoda nextToken(), która zwraca kolejny element jako String. String s1 = st.nextToken(); // napis "21" String s2 = st.nextToken(); // napis "+" String s3 = st.nextToken(); // napis "21"

● Gdy nie ma już elementów "do zwrotu" - wywołanie nextToken() spowoduje powstanie wyjątku NoSuchElementException.

● Do stwierdzenia, czy w łańcuchu znakowym są jeszcze elementy do zwrotu służy metoda hasMoreTokens().

Page 32: JAVA- wykład 4 · 2015. 10. 29. · 3 WYJĄTKI Wykonywane są kolejne instrukcje bloku try. Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie

32

Rozbiór tekstów - StringTokenizer

● Metoda hasMoreTokens() zwraca true, jeśli w łańcuchu znakowym są jeszcze nie "wyłuskane" elementy i false w przeciwnym razie. Inaczej mówiąc: hasMoreTokens() zwraca true, jeśli następne odwołanie do nextToken() zwróci kolejny element i zwraca false, gdy ew. następne odwołanie do nextToken() spowoduje wyjątek NoSuchElementException.

● Pętla, w której pobieramy kolejne elementy:while (st.hasMoreTokens()) { String s = st.nextToken(); // ... tu coś robimy z s}

● Inna postać konstruktora klasy StringTokenizer pozwala na określenie zbioru separatorów, które będą służyć do wyróżniania elementów. Jeżeli napiszemy np.StringTokenizer st = new StringTokenizer(s, "., ")

//to separatorami będą kropka, przecinek i spacja.