jan bielecki java od podstaw.pdf

Upload: jan-abramek

Post on 16-Oct-2015

303 views

Category:

Documents


2 download

TRANSCRIPT

  • 1

    Jan Bielecki

    Java od

    podstaw

  • 2

    Moim przyjacioom

    Hanne i Rainerowi

    Langmaack

  • 3

    Spis treci

    Od Autora

    Cz I Jzyk Java

    Aplikacje i aplety

    Modyfikowanie apletu

    Obsugiwanie zdarze Wykonywanie wtkw Obsugiwanie wyjtkw

    Cz II rodowisko rozwojowe

    Programowanie manualne

    Programowanie wizualne

    Cz III Podstawy programowania

    Leksemy

    Zmienne

    Instrukcje

    Tablice

    Obiekty

    Strumienie

    Cz IV Programowanie obiektowe

    Hermetyzacja

    Dziedziczenie

    Interfejsy

    Konwersje

    Polimorfizm

    Kolekcje

    Cz V Programowanie zdarzeniowe

    Klasa zdarzeniowa

    Obsugiwanie zdarze Odtwarzanie pulpitu

    Cz VI Programowanie wspbiene

    Stany wtkw Priorytety

    Wtek gwny Tworzenie wtkw Synchronizowanie wtkw Instrukcja synchronizujca

  • 4

    Procedury synchronizowane

    Monitor

    Impas

    Cz VII Programowanie apletw

    Opis

    Wykonanie

    Otoczenie

    Grafika

    Klawiatura

    Myszka

    Kursory

    Obrazy

    Rozkady Sterowniki

    Pojemniki

    Kontrolki

    Dwiki Animacje

    Przesyanie Komunikacja

    Przeczenia

    Literatura

    Sownik terminw

    Dodatki

    A Priorytety operatorw B Parametry zdarze C Klasa uruchomieniowa

    D Styl programowania

    E Typy predefiniowane

    F Operacje i operatory

  • 5

    Od Autora

    Nie ulega wtpliwoci, e to co si dzieje wok Javy jest rewolucj. Po dugim okresie przestoju, w ktrym aktywno w zakresie jzykw programowania ograniczaa si do porzdkowania tego, co byo ju znane od kilkunastu lat, pojawi si nowy jzyk, ktry niemal z dnia na dzie zyska aprobat zarwno specjalistw, jak i zwykych uytkownikw Internetu.

    Swj sukces zawdzicza Java temu, i wysza spod rki zawodowego programisty, e wykorzystano w niej najlepsze pomysy zawarte w jzykach C++, Objective C i Smalltalk oraz e wbudowujc w ni mechanizmy programowania strukturalnego, obiektowego, zdarzeniowego i wspbienego przygotowano grunt pod programowanie rozproszone.

    Dziki odwanej decyzji implementowania Javy jako jzyka interpretowanego, ktrego kod wynikowy jest wykonywany na Maszynie Wirtualnej, zapewniono przenono programw midzy odmiennymi platformami sprztowymi i systemowymi, i to nie tylko na poziomie kodu rdowego, ale rwnie na poziomie kodu binarnego.

    Powszechne zaakceptowanie Javy przekroczyo najmielsze oczekiwania jej twrcy Jamesa Goslinga. W lad za wsparciem udzielonym jej przez przez wiodce firmy komputerowe: Sun, Microsoft, IBM, Apple, Oracle, Corel, Netscape, Symantec, Borland, Hewlett Packard, Silicon Graphics, Toshiba, poszy liczne implementacje wizualnych rodowisk Rozwojowych, w tym Cafe i Visual Cafe (Symantec), Open JBuilder (Borland), SuperCede (Asymetrix), Parts for Java (ParcPlace), Visual J++ (Microsoft),

    Java WorkShop (Sun) i CodeWarrior (Metrowerks).

    Opracowano wiele wyspecjalizowanych bibliotek jzyka, opublikowano specyfikacj komponentw JavaBeans, implementowano konfigurowaln przegldark HotJava Views oraz wprowadzono na rynek komputery sieciowe JavaStation wyposaone w system operacyjny JavaOS. W deniu do penego upowszechnienia Javy podjto produkcj ukadu scalonego PicoJava, umoliwiajcego wyposaenie w ni takich miniaturowych urzdze konsumenckich jak komrki, faksy i kalkulatory.

    Niniejsz ksik, zapowiedzian w przedmowie do Java po C++ napisaem dla tych, ktrzy mieli ju styczno z programowaniem, ale nie znaj C++ ani nawet jzyka C. W tej postaci przedkadam j informatykom zafascynowanym nowymi narzdziami Internetu oraz tym wszystkim, ktrzy w lad za wiodcymi orodkami akademickimi porzuc Turbo Pascal, Delphi i Visual Basic, decydujc si na zainwestowanie swego czasu w poznanie narzdzia nastpnego wieku.

    Lektura tekstu, ktrego kolejnymi czciami s: Jzyk Java, rodowisko rozwojowe, Podstawy programowania, Programowanie obiektowe, Programowanie zdarzeniowe, Programowanie wspbiene, Programowanie apletw i Sownik terminw oraz bardzo wane dla penego poznania jzyka Dodatki, umoliwia agodne wejcie w tematyk programowania w Javie, przygotowujc do lektury mojej nastpnej ksiki pt. Java - programowanie wizualne, powiconej wspczesnej metodyce programowania, wstpnie przedstawionej tu w rozdziale o rodowiskach rozwojowych

    Jestem przekonany, e niniejszy podrcznik w peni zaspokoi potrzeby tych, ktrzy chc pozna Jav od podstaw oraz e dostarczy obszernego materiau praktycznego nie tylko suchaczom moich wykadw w Politechnice Warszawskiej i Polsko-Japoskiej Wyszej Szkole Technik Komputerowych, ale rwnie tym wszystkim, ktrzy podziel pogld, e gruntowne poznanie Javy jest bardzo dobr inwestycj.

    Jan Bielecki

  • 6

    Cz I Jzyk Java

    Java jest nowym jzykiem programowania opartym na uznanych jzykach starszej generacji. We wczesnej fazie powstawania bya projektowana jako narzdzie do programowania komunikujcych si ze sob konsumenckich urzdze elektronicznych, ale wkrtce przeksztacono j w narzdzie do programowania aplikacji w sieciach korporacyjnych i w Internecie.

    Gwn zalet Javy jest przenono programw na poziomie kodu binarnego. Dziki temu program uruchomiony w pewnym rodowisku operacyjnym (np. Windows) moe by wykonany w dowolnym innym (np. Unix i MacOS). T unikaln waciwo zawdzicza Java temu, i jest jzykiem interpretowanym, a nie kompilowanym.

    Program rdwy w Javie przygotowuje si za pomoc edytora, a nastpnie poddaje si kompilacji, uruchomieniu i testowaniu. Produktem kocowym jest B-kod Maszyny Wirtualnej (JavaVM) umieszczony w pliku z rozszerzeniem .class.

    Warunkiem wykonania B-kodu jest wyposaenie platformy programistycznej w emulator Maszyny Wirtualnej: ukad scalony, albo program napisany w rodzimym jzyku platformy. Inwestycja ta jest niewielka i zostaa ju wykonana we wszystkich liczcych si systemach (Windows, Unix, MacOS).

    _________________________________________________________________________________________

    Aplikacje i aplety

    Program napisany w Javie jest aplikacj lub apletem. Aplikacja jest programem samodzielnym, a aplet jest programem zanurzonym w aplikacji, na przykad w przegldarce Netscape.

    Poniewa przegldarka przydziela apletowi wydzielony obszar okna, nazywany zazwyczaj pulpitem, wic okrelenie aplet utosamia si czsto nie z samym jego programem, ale z tym co ten program wykreli. Z tego powodu maj sens i mog by uywane takie okrelenia jak: napisanie apletu (utworzenie kodu programu) i wywietlenie apletu (uwidocznienie wynikw wykonania kodu).

    Struktura programu

    Kady program skada si z co najmniej jednego moduu rdowego umieszczonego w pliku. Tekst moduu zapisuje si w ukadzie swobodnym, z dowolnie dodanymi odstpami (spacjami, tabulacjami i zakoczeniami wierszy).

    Odstpy mona umieszcza poza jednostkami leksykalnymi programu (sowami kluczowymi, identyfikatorami, operatorami i ogranicznikami).

    Szczegln odmian odstpu stanowi komentarz wierszowy. Zaczyna si on od pary znakw // (skonik, skonik), a koczy w miejscu zakoczenia wiersza. Cay taki napis jest traktowany jak jedna spacja, a wic jest ignorowany.

    Aplikacje

    Aplikacj jest program skadajcy si z zestawu definicji klas, z ktrych przynajmniej jedna jest publiczna i zawiera publiczn i statyczn funkcj gwn.

    Nagwek funkcji gwnej ma posta public static void main(String args[])

    Wykonanie aplikacji koczy si w chwili, gdy w funkcji gwnej wykona si instrukcj powrotu return;

    albo gdy z dowolnej procedury (w tym z funkcji gwnej) wywoa si funkcj exit.

    Uwaga: Przytoczona instrukcja jest domniemywana przed kad klamr koczc definicj procedury o rezultacie void, a wic jawne jej uycie jest na og zbyteczne.

    Przykad Najprostsza aplikacja public

    class Master {

  • 7

    public statatic void main(String args[])

    {

    }

    }

    Klasa Master jest publiczna. Zawiera ona publiczn i statyczn funkcj gwn.

    Tu przed klamr koczc definicj funkcji domniemano instrukcj powrotu.

    Aplikacje znakowe

    Wyniki aplikacji znakowej s wyprowadzane na konsol (ekran monitora), a w rodowisku graficznym (np. Windows 95) do okna konsoli.

    Nastpujca aplikacja, pokazana podczas wykonania na ekranie Aplikacja znakowa, wyprowadza do okna konsoli napis Hello, I am JanB.

    Ekran Aplikacja znakowa ### textapp.gif

    Przykad Aplikacja znakowa public

    class Master {

    public static void main(String args[])

    {

    // wyprowadzenie tekstu na konsol

    System.out.println("Hello, I am JanB.");

    }

    }

    Dziki uyciu procedury println, a nie print, zapewniono wyprowadzenie wiersza znakw, a nie tylko znakw zawartych w cudzysowach.

    Wstrzymanie zakoczenia aplikacji Jeli aplikacja znakowa jest wykonywana w rodowisku graficznym, to w chwili jej zakoczenia usuwa si z ekranu okno konsoli. W celu uniknicia towarzyszcego temu "zniknicia" wynikw, zaleca si uycie instrukcji System.in.read();

    Spowoduje to wstrzymanie zamknicia okna konsoli do chwili wprowadzenia z klawiatury dowolnego znaku (np. Enter).

    W takim jednak wypadku naley nagwek procedury zawierajcej t instrukcj uzupeni fraz throws IOException

    a aplikacj poprzedzi poleceniem import java.io.IOException

    albo import java.io.*;

    Na przykad import java.io.IOException;

    public

    class Master {

    public static void main(String args[])

    {

    // wyprowadzenie tekstu na konsol

    System.out.println("Hello, I am JanB.");

    System.in.read();

    }

    }

  • 8

    Aplikacje graficzne

    Wyniki aplikacji graficznej s wyprowadzane do wasnego okna graficznego. Zamknicie okna nie jest na og wystarczajce i w chwili zamknicia aplikacji musi by wywoana funkcja exit.

    Do komunikowania si aplikacji z oknem graficznym jest wykorzystywany wykrelacz dysponujcy informacjami o waciwociach rodowiska (np. o rodzaju uytej karty graficznej). Dziki temu unika si programowego rozpoznawania rodowiska i umoliwia pisanie programw, ktre mog by wykonywane na dowolnej platformie.

    Uwaga: Wykrelacz zwizany z oknem mona utworzy dopiero wwczas, gdy okno jest ju wywietlone na ekranie (to jest dopiero po wywoaniu metody show).

    Nastpujca aplikacja, pokazana podczas wykonania na ekranie Aplikacja graficzna, wykrela w oknie napis Hello, I am JanB.

    Ekran Aplikacja graficzna ### graphapp.gif

    import java.io.IOException;

    import java.awt.*;

    public

    class Master {

    public static void main(String args[])

    throws IOException

    {

    // utworzenie okna graficznego

    Frame frame = new MyFrame("Results");

    // okrelenie rozmiarw okna

    frame.resize(160, 80);

    // wywietlenie okna

    frame.show();

    // utworzenie wykrelacza

    // komunikujcego si z oknem

    Graphics gDC = frame.getGraphics();

    // wykrelenie tekstu

    // za porednictwem wykrelacza

    gDC.drawString("Hello, I am JanB.", 10, 20);

    System.out.println("Press Enter to exit!);

    System.in.read();

    System.exit(0);

    }

    }

    class MyFrame extends Frame {

    MyFrame(String caption)

    {

    // przekazanie nazwy okna klasie Frame

    super(caption);

    }

    // obsuga zdarzenia WINDOW_DESTROY

    // generowanego w chwili zamknicia okna

    public boolean handleEvent(Event evt)

    {

    if(evt.id == Event.WINDOW_DESTROY) {

    hide(); // ukrycie okna

    dispose(); // zniszczenie okna

    return true;

    } else

    return super.handleEvent(evt);

    }

    }

    Program aplikacji skada si z definicji klas Master i MyFrame. Klasa Master zawiera definicj funkcji gwnej, a klasa MyFrame wywodzi si z klasy bibliotecznej Frame.

    Poza klas Frame, aplikacja posuguje si klas biblioteczn Graphics. Kod tych klas jest zawarty w pakiecie java.awt, wczonym do programu za pomoc deklaracji importu

  • 9

    import java.awt.*;

    W celu uniknicia przedwczesnego zamknicia aplikacji, wywoanie funkcji exit poprzedzono wykonaniem instrukcji System.in.read();

    Aplety

    Apletem jest program skadajcy si z zestawu definicji klas, z ktrych przynajmniej jedna jest publiczna i wywodzi si (extends) od klasy Applet.

    Tak zdefiniowana klasa apletowa zawiera w oglnym wypadku procedury init, start, paint, stop, destroy stanowice jej metody. Wymienione metody s wywoywane przez przegldark w podanej kolejnoci. Metoda init oraz metoda destroy jest wywoywana jednokrotnie. Metody start, stop i paint mog by wywoywane wielokrotnie.

    Uwaga: Program apletu nie musi zawiera takich typowych wywoa System.in.read() i System.exit(0).

    W najprostszym przypadku wystarcza zdefiniowanie w aplecie tylko metody paint. Jest ona wywoywana wkrtce po wykonaniu metody init, a take w kadej sytuacji gdy zaistnieje potrzeba odtworzenia pulpitu apletu (na przykad po zasoniciu i odsoniciu go przez pewne okno).

    Aby przegldarka moga wywietli aplet, naley przekaza jej opis apletu. Uproszczony do minimum ma on posta

    w ktrej Nazwa jest nazw klasy apletowej, a Szeroko i Wysoko okrelaj poziomy i pionowy rozmiar apletu.

    Nastpujcy aplet, pokazany podczas wykonania na ekranie Pozdrowienie, wykrela na swoim pulpicie napis Hello, I am JanB.

    Ekran Pozdrowienie ### hello.gif

    ==============================================

    import java.applet.*;

    import java.awt.*;

    public

    class Master extends Applet {

    Font font; // czcionka

    public void init()

    {

    font = new Font("TimesRoman", // krj

    Font.BOLD | Font.ITALIC, // styl

    24); // rozmiar

    }

    public void paint(Graphics gDC)

    {

    gDC.setFont(font); // wstaw do wykrelacza

    gDC.drawString("Hello, I am JanB.", 10, 50);

    }

    }

    Program apletu skada si z definicji klasy Master wywodzcej si od klasy Applet.

    Klasa Master zawiera definicje metod init i paint. Metoda init jest wywoywana jednokrotnie, a metoda paint jest wywoywana co najmniej jeden raz.

  • 10

    W metodzie init przygotowano czcionk do wykrelenia tekstu. W metodzie paint jest ona wstawiana do wykrelacza, dziki czemu zapowiedziany napis jest wykrelany czcionk TimesRoman, pogrubion (BOLD) i pochylon (ITALIC), o rozmiarze 24 punktw (1 punkt drukarski to okoo 1/72 cala).

    Aplikacje a aplety

    Podzia na aplikacje i aplety jest umowny. Nastpujcy program jest zarwno apletem jak i aplikacj.

    ===============================================

    import java.applet.*;

    import java.awt.*;

    import java.io.IOException;

    public

    class Master extends Applet {

    public static void main(String args[])

    {

    System.out.println("I am an application.");

    System.in.read();

    System.exit(0);

    }

    public void paint(Graphics gDC)

    {

    gDC.drawString("I am an applet.", 10, 10);

    }

    }

    W zalenoci od sposobu potraktowania, program wyprowadza napis I am an applet.

    albo I am an application.

    _________________________________________________________________________________________

    Modyfikowanie apletu

    Kada klasa definiujca aplet jest opisem rodziny obiektw. Jeli podklasa (klasa pochodna) wywodzi si od innej klasy, to jej obiekty skadaj si ze skadnikw jej nadklasy (klasy bazowej) oraz dodatkowo z wasnych skadnikw podklasy.

    Jeli w podklasie wystpuje metoda o identycznej sygnaturze jak pewna metoda nadklasy, to przedefiniowuje ona metod nadklasy. Dziki temu, definiujc podklas wystarczy poda w niej tylko metody przedefiniowujce oraz metody dodatkowe.

    Uwaga: Metoda przedefiniowujca nie moe by bardziej-prywatna ni metoda przedefiniowywana. W szczeglnoci, jeli metoda przedefiniowywana jest publiczna, to metoda przedefiniowujca take musi by publiczna.

    Nastpujcy aplet, pokazany podczas wykonania na ekranie Modyfikowanie, ilustruje zasad modyfikowania apletu przez zastosowanie przedefiniowania metod.

    Ekran Modyfikowanie ### modify.gif

    ==============================================

    // Plik Master.java

    import java.applet.*;

    import java.awt.*;

    public

    class Master extends Applet {

    Font font; // czcionka

    public void init()

  • 11

    {

    font = new Font("TimesRoman", // krj

    Font.BOLD | Font.ITALIC, // styl

    24); // rozmiar

    }

    public void paint(Graphics gDC)

    {

    gDC.setFont(font); // wstaw do wykrelacza

    gDC.drawString("Hello, I am JanB.", 10, 50);

    }

    }

    // Plik Master2.java

    import java.applet.*;

    import java.awt.*;

    public

    class Master2 extends Master {

    public void init()

    {

    font = new Font("Helvetica", // krj

    Font.BOLD, // styl

    18); // rozmiar

    }

    }

    Klasa Master2 wywodzi si od klasy Master, a wic porednio od klasy Applet.

    Klasa Master2 zawiera wszystkie skadniki apletu Master (w tym jego metod paint), ale przedefiniowuje jego metod init.

    Dlatego wykonanie apletu Master2 powoduje wykrelenie napisu Hello, I am JanB.

    18 pt czcionk Helvetica, a nie 24 pt czcionk TimesRoman.

    _________________________________________________________________________________________

    Obsugiwanie zdarze

    Od czasu pojawienia si Javy, mona zauway powszechne wyposaanie stron WWW w interakcyjne aplety, reagujce na takie zdarzenia zewntrzne jak kliknicie przyciskiem myszki albo nacinicie klawisza klawiatury.

    Obsugiwanie zdarze zewntrznych odbywa si za pomoc predefiniowanych metod klas komponentowych (m.in. Panel, Applet), opisujcych takie obiekty oblicza graficznego (Graphical interface) jak etykiety (Label), przyciski (Button), ramki (Frame), itp.

    Obsuga domniemana polega zazwyczaj na zignorowaniu zdarzenia, dlatego w celu dostarczenia wasnej obsugi zdarzenia zewntrznego, naley dokona przedefiniowania metody domniemanej.

    W szczeglnoci, poniewa w klasie komponentowej Applet obsuga przecigania kursora myszki jest okrelona przez metod public boolean mouseDrag(Event evt, int x, int y)

    {

    return false; // zignoruj zdarzenie

    }

    wic w celu dostarczenia wasnej obsugi wystarczy przedefiniowa metod mouseDrag.

    Nastpujcy aplet, pokazany podczas wykonywania na ekranie Wykrelanie z rki, ilustruje zasad obsugiwania zdarze.

    Ekran Wykrelanie z rki ### scribe.gif

    ==============================================

    import java.applet.*;

  • 12

    import java.awt.*;

    public

    class Master extends Applet {

    int xPos, yPos;

    Graphics gDC;

    public void init()

    {

    gDC = getGraphics();

    }

    public boolean mouseDown(Event evt, int x, int y)

    {

    xPos = x;

    yPos = y;

    return true;

    }

    public boolean mouseDrag(Event evt, int x, int y)

    {

    gDC.drawLine(xPos, yPos, x, y);

    xPos = x;

    yPos = y;

    return true;

    }

    public boolean mouseUp(Event evt, int x, int y)

    {

    repaint();

    return true;

    }

    public void paint(Graphics gDC)

    {

    gDC.drawString("Drag mouse to draw!", 10, 20);

    }

    }

    Wykonanie metody init powoduje utworzenie wykrelacza zwizanego z pulpitem apletu.

    Wykonanie metody paint powoduje wykrelenie zachty do wykrelania linii metod przecigania kursora myszki.

    Wykonanie metody mouseDown powoduje zapamitanie wsprzdnych punktu nacinicia przycisku myszki.

    Kadorazowe wykonanie metody mouseDrag powoduje wykrelenie odcinka czcego punkt poprzedni z biecym.

    Wykonanie metody mouseUp powoduje wywoanie metody repaint.

    Wywoanie metody repaint powoduje, e po zakoczeniu wykonywania metody z ktrej j wywoano (tu metody mouseUp), nastpi wywoanie metody update (domylnie wyczyszczenie pulpitu i wywoanie metody paint).

    _________________________________________________________________________________________

    Wykonywanie wtkw

    Oprogramowanie ruchomej grafiki wymaga utworzenia co najmniej jednego dodatkowego wtku: niezalenego od obsugi zdarze, przepywu sterowania przez B-kod programu.

    W celu ustanowienia wtku naley utworzy obiekt klasy Thread oraz okreli w jakiej klasie znajduje si metoda run, okrelajca czynnoci wtku.

    Uwaga: Klasa zawierajca metod run musi implementowa interfejs Runnable. Fakt ten wyraa si za pomoc sowa kluczowego implements.

    Nastpujcy aplet, pokazany podczas wykonywania na ekranie Wykonywanie wtkw, ilustruje zasad programowania wspbienego z wykorzystaniem wtkw.

    Ekran Wykonywanie wtkw ### thread.gif

    ===============================================

  • 13

    import java.applet.*;

    import java.awt.*;

    public

    class Master extends Applet {

    Thread thread;

    Graphics gDC;

    Color backGround;

    Circle circle;

    public void init()

    {

    gDC = getGraphics();

    backGround = getBackground();

    circle = new Circle(gDC, backGround);

    thread = new Thread(circle);

    thread.start();

    }

    }

    class Circle implements Runnable{

    Graphics gDC;

    Color backGround;

    Circle(Graphics gdc, Color back)

    {

    gDC = gdc;

    backGround = back;

    }

    public void run()

    {

    for(int i = 0; i < 100 ; i++) {

    gDC.setColor(Color.black);

    gDC.drawOval(i, i, i/2, i/2);

    try {

    Thread.currentThread().sleep(100);

    }

    catch(InterruptedException e) {

    }

    gDC.setColor(backGround);

    gDC.drawOval(i, i, i/2, i/2);

    }

    }

    }

    Wykonanie instrukcji

    circle = new Circle(gDC, backGround);

    powoduje utworzenie obiektu klasy Circle, ktrego skadnikiem jest metoda run.

    Wykonanie instrukcji

    thread = new Thread(circle);

    powoduje utworzenie obiektu zarzdzajcego wtkiem.

    Wykonanie instrukcji

    thread.start();

    powoduje utworzenie wtku realizowanego przez metod run (tu: wykrelenie okrgu poruszajcego si po przektnej apletu).

    Zakoczenie wykonywania metody run powoduje zniszczenie wtku.

    _________________________________________________________________________________________

  • 14

    Obsugiwanie wyjtkw

    Podczas wykonywania programu mog wystpi sytuacje wyjtkowe: dzielenie przez 0, dostarczenie danej o zym formacie, albo napotkanie koca pliku.

    Z miejsca wystpienia sytuacji wyjtkowej jest wysyany wyjtek: obiekt szczegowo opisujcy sytuacj wyjtkow. Dziki temu, e wyjtek moe by przechwycony, a sytuacja wyjtkowa obsuona, stwarza si szans wyjcia z powstaej sytuacji wyjtkowej i umoliwia kontynuowanie wykonywania programu.

    Do jawnego wysyania wyjtkw suy instrukcja throw, a do przechwytywania i obsugiwania wyjtkw instrukcja try. Jeli wywoanie pewnej procedury moe spowodowa wysanie wyjtku, to wymaga si, aby zawarto je w bloku instrukcji try, albo aby w nagwku procedury wywoujcej umieszczono fraz throws wyszczeglniajc ten wyjtek.

    Uwaga: Wyszczeglnienie nazwy wyjtku we frazie throws metody przedefiniowujcej jest dozwolone tylko wwczas, gdy taka nazwa wystpuje albo moe wystpi we frazie throws metody przedefiniowywanej.

    Na przykad int readByte(String fileName)

    throws IOException

    {

    try {

    FileInputStream inp = new FileInputStream(fileName);

    try {

    return inp.read();

    }

    catch(IOException e) {

    System.out.println("File " + fileName +

    " empty or read error");

    throw new IOException();

    }

    }

    catch(FileNotFoundException e) {

    System.out.println("File " + fileName +

    " does not exist");

    return -1;

    }

    }

    Podczas wykonania operacji

    new FileInputStream(fileName)

    moe zosta wysany wyjtek klasy FileNotFoundException albo wyjtek klasy IOException.

    Wysanie pierwszego z nich jest obsuone przez zewntrzn fraz catch, a o moliwoci wysania drugiego informuje fraza throws.

    Podczas wykonywania operacji

    inp.read()

    moe by wysany wyjtek klasy IOException. Wyjtek ten jest obsuony przez wewntrzn fraz catch.

    Poniewa w ciele funkcji readByte uyto instrukcji throw new IOException();

    wic w jej nagwku musi wystpi fraza throws.

    Osabienie wymaga

    Wymaganie uycia frazy throws nie dotyczy wyjtkw kategorii RuntimeException, w tym wyjtkw

    ArithmeticException (bd operacji arytmetycznej) NumberFormatException (zy format liczby) IndexOutOfBoundsException (indeks poza zakresem)

  • 15

    NegativeArraySizeException (ujemny rozmiar tablicy)

    NullPointerException (odwoanie przez odniesienie puste)

    oraz wyjtkw kategorii Error, w tym wyjtkw

    OutOfMemoryError (brak pamici operacyjnej) StackOverflowError (przepenienie stosu) ClassFormatError (bd reprezentacji klasy) NoClassDefFoundError (brak definicji klasy)

    ale dotyczy wyjtkw kategorii IOException zwizanych z wykonywaniem operacji wejcia-wyjcia, w tym m.in. wyjtkw

    EOFException (koniec pliku)

    FileNotFoundException (brak pliku)

    InterruptedIOException (przerwanie przesania)

    Przykad Obsugiwanie wyjtkw import java.io.*;

    public

    class Master {

    public static void main(String args[])

    throws IOException

    {

    open("SOURCE", 0);

    System.in.read();

    }

    static void open(String fileName, int value)

    {

    // nastpna instrukcja jest poprawna, mimo i

    // nie przewidziano dla niej obsugi wyjtku

    // ArithmeticException

    System.out.println(1 / value);

    // ...

    FileInputStream stream;

    // nastpna instrukcja jest bdna, poniewa

    // nie przewidziano dla niej obsugi wyjtkw

    // FileNotFoundException i IOException

    stream = new FileInputStream(fileName);

    }

    }

    Mimo i podczas wykonywania instrukcji System.out.println(1 / value);

    moe by wysany wyjtek ArithmeticException, nie stawia si wymagania obsuenia go.

    Podczas wykonania instrukcji

    stream = new FileInputStream(fileName);

    moe zosta wysany wyjtek FileNotFoundException oraz wyjtek IOException.

    Poniewa aden z tych wyjtkw nie zosta obsuony, wic przytoczony program jest bdny.

    Jednym ze sposobw poprawienia bdu jest uycie instrukcji try dla wyjtku FileNotFoundException oraz umieszczenie w nagwku funkcji open frazy throws wyszczeglniajcej wyjtek IOException. import java.io.*;

    public

    class Master {

    public static void main(String args[])

    throws IOException

    {

    open("SOURCE", 0);

    System.in.read();

    }

  • 16

    static void open(String fileName, int value)

    throws IOException

    {

    try {

    System.out.println(1 / value);

    }

    catch(ArithmeticException e) {

    System.out.println("Division by 0");

    System.exit(-1); // przerwanie wykonywania

    }

    // ...

    FileInputStream stream;

    try {

    stream = new FileInputStream(fileName);

    }

    catch(FileNotFoundException e) {

    System.out.println("File" + fileName +

    " not found");

    System.exit(-2);

    }

    }

    }

    Poniewa z nagwka funkcji open wynika, e moe by z niej wysany wyjtek klasy IOException, wic uwzgldniono to w funkcji main. Jako metod obsugi przyjto uycie frazy throws wyszczeglniajcej ten wyjtek.

    W celu usunicia z nagwka funkcji open frazy throws, naleaoby instrukcj try {

    stream = new FileInputStream(fileName);

    }

    catch(FileNotFoundException e) {

    System.out.println("File" + fileName +

    " not found");

    System.exit(-2);

    }

    zastpi na przykad instrukcj try {

    stream = new FileInputStream(fileName);

    }

    catch(FileNotFoundException e) {

    System.out.println("File" + fileName +

    " not found");

    System.exit(-2);

    }

    catch(IOException e) {

    System.exit(-3);

    }

  • 17

    Cz II rodowisko rozwojowe

    Do uruchomienia zamieszczonych w ksice programw uyto rodowiska Rozwojowego Cafe (wersja 1.51) skadajcego si z wbudowanego edytora, kompilatora i uruchamiacza. rodowisko to, opracowane przez firm Symantec, uzyskao w kategorii narzdzi do programowania w Internecie tytu Najlepszego Produktu Roku (The best product for Web Development). Poniewa na tytu ten w peni zasuguje, a jest znacznie lepsze ni inne porwnywalne produkty (np. Visual J++), wic mona je z przekonaniem poleci kademu, komu zaley na komfortowym programowaniu w Javie.

    Wywoanie rodowiska

    Po wywoaniu rodowiska Cafe pojawia si informacja o jego wersji. Jest ona wywietlana take po wydaniu polecenia Help/About. Na ekranie Winieta Cafe pokazano ekran identyfikujcy rodowisko.

    Ekran Winieta Cafe ### welcome.gif

    Tworzenie programw

    rodowisko Cafe umoliwia tworzenie programw nie tylko w sposb tradycyjny, to jest metod manualnego generowania kodu, ale rwnie zawiera mechanizmy umoliwiajce programowanie wizualne, dostpne w takich rodowiskach drugiej generacji jak

    Visual Cafe (Symantec)

    Java WorkShop (Sun)

    Open JBuilder (Borland)

    SuperCede (Asymetrix)

    CodeWarrior (Metrowerks)

    Parts for Java (ParcPlace)

    Programowanie wizualne jest bardzo atrakcyjne dla tych, ktrzy nie chc nadmiernie zagbia si w tajniki programowania w Javie, ale chc w krtkim czasie uzyska poprawnie dziaajcy i wcale niebanalny program.

    _________________________________________________________________________________________

    Programowanie manualne

    Programowanie manualne polega na rcznym przygotowaniu skadnikw programu, a nastpnie utworzeniu z nich wykonywalnego programu wynikowego. Przy takim postpowaniu wyposaenie programu w oblicze graficzne (graphical interface) jest niekiedy do uciliwe, ale czyni program krtszym i wydajniejszym.

    Edycja dokumentu

    Wydanie polecenia File/New powoduje utworzenie okna edycyjnego, w ktrym mona przygotowa modu rdowy albo dokument HTML. Po zakoczeniu edycji modu albo dokument naley zapamita w pliku.

    Jeli tekst jest moduem rdowym, ktry zawiera klas publiczn Class, to nazw pliku musi by Class.java. Jeli jest dokumentem HTML, to nazwa pliku powinna mie rozszerzenie .html.

    Uwaga: Jeli program zawiera tylko jedn klas publiczna Class, to zaleca si umieszczenie dokumentu HTML w pliku Class.html.

    Utworzenie projektu

    W celu utworzenia projektu naley wyda polecenie Project/New. Spowoduje to wywietlenie okna dialogowego Project Express pokazanego na ekranie Nazwanie projektu.

    Ekran Nazwanie projektu ### name.gif

  • 18

    W klatce Project Name naley wwczas poda Nazw projektu, a przez zapoznanie si z list Directories upewni, e plik projektu zostanie zapamitany w uprzednio utworzonym katalogu.

    Po naciniciu przycisku Next wywietli si okno pokazane na ekranie Okrelenie typu projektu.

    Ekran Okrelenie typu projektu ### type.gif

    W oknie tym naley poda czy tworzony program jest aplikacj czy apletem (lista Target Type), a przez wybranie nastawy Project Settings zdecydowa si na to, czy program wynikowy bdzie uruchamiany (Debug) czy dystrybuowany (Release).

    Po naciniciu przycisku Next wywietli si okno pokazane na ekranie Dodaj pliki. W oknie tym naley poda jakie pliki wchodz w skad projektu. Odbywa si to przez dwukliknicie elementu listy File Name, albo przez zaznaczenie jej elementu i nacinicie przycisku Add.

    Uwaga: Jeli projekt dotyczy apletu, to do projektu naley rwnie wczy plik zawierajcy dokument HTML.

    Ekran Dodaj pliki ### addfile.gif

    Po naciniciu przycisku Next wywietli si okno pokazane na ekranie Ustawienia pocztkowe. W jego klatce Class Path mona poda nazwy katalogw, w ktrych maj by poszukiwane pliki wczone do projektu.

    Uwaga: Jeli klasy programu nale do pakietu domylnego (w pliku rdowym nie ma polecenia package), to klatka Class Path moe pozosta pusta).

    Ekran Ustawienia pocztkowe ### settings.gif

    Otwarcie projektu

    Uprzednio utworzony projekt moe by nastpnie otwarty, a przetwarzanie programu moe by wwczas kontynuowane.

    W celu otwarcia projektu naley wyda polecenie Project/Open. Spowoduje to wywietlenie okna Open Project, pokazanego na ekranie Otwarcie projektu. W jego klatce File Name, z uwzgldnieniem katalogu okrelonego przez list Folders, naley poda nazw uprzednio utworzonego projektu.

    Ekran Otwarcie projektu ### openprj.gif

    Modyfikowanie projektu

    W celu zmodyfikowania otwartego (a wic ju istniejcego) projektu, naley wyda polecenie Project/Edit albo Project/Settings. Spowoduje to wywietlenie znanych ju okienek dialogowych, w ktrych mona dokona modyfikacji projektu (np. przeksztaci aplikacj w aplet, lub odwrotnie).

    Konfigurowanie pulpitu

    Przed, albo po utworzeniu projektu mona skonfigurowa pulpit rodowiska. Mona to wykona za pomoc polece menu Window. W szczeglnoci wydanie polece Views, Build i Debug spowoduje wywietlenie okienek pokazanych na ekranie Okienka rodowiska.

    Uwaga: Operacje na okienku Views odbywaj si przez przecignicie ikony, a operacje na okienku Builds i Debug odbywaj si przez kliknicie.

    Ekran Okienka rodowiska ### desktop.gif

  • 19

    Kompilowanie moduu

    W celu skompilowania moduu rdowego naley w okienku Build klikn ikon Compile. Jeli modu zawiera bdy, to kompilator wywietli je w odrbnym oknie. Dwukliknicie wiersza wyszczeglniajcego bd spowoduje wywietlenie tego fragmentu programu, w ktrym bd ten wykryto.

    Uwaga: Skompilowanie pojedynczego moduu jest wykonywane rzadko. Zazwyczaj od razu przystpuje si do zbudowania programu. W takim wypadku Cafe kompiluje tylko te moduy, ktre zostay zmienione w okresie od poprzedniej ich kompilacji.

    Na ekranie Niepomylna kompilacja pokazano skutek skompilowania programu zawierajcego bdy skadniowe.

    Ekran Niepomylna kompilacja ### badcomp.gif

    Budowanie programu

    W celu zbudowania programu naley w okienku Build klikn ikon Build albo Rebuild All. Nastpi wwczas skompilowanie wszystkich moduw wchodzcych w skad projektu i utworzenie B-kodu programu. Sygnalizowanie ewentualnych bdw skadniowych odbywa tak jak podczas kompilowania moduu.

    Budowanie moe dotyczy tylko takiego programu, w ktrym wyrniono modu gwny (plik zawierajcy opis apletu albo program z funkcj main). Ma to istotne znaczenie zwaszcza wwczas, gdy w skad projektu wchodzi wicej ni jeden modu rdowy albo dokument HTML. W takim wypadku naley w oknie projektu klikn lewym przyciskiem myszki nazw moduu, a nastpnie klikn j prawym i wybra opcj Mark as Main. Wykonanie tej operacji pokazano na ekranie Zdefiniowanie moduu gwnego.

    Ekran Zdefiniowanie moduu gwnego ### main.gif

    Uwaga: Podczas kompilowania lub budowania programu pojawia si niekiedy komunikat Access violation

    Ten niepokojcy komunikat, ktremu nie towarzyszy adna diagnoza o przyczynie bdu, jest najczciej wywoany literwk w nazwie klasy, na przykad napisaniem new DEbug();

    zamiast

    new Debug();

    albo doprowadzeniem do wystpienia niezrwnowaonych nawiasw klamrowych.

    Na ekranie Zagroenie bezpieczestwa pokazano sytuacj, ktra doprowadzia do powstania rozpatrywanego komunikatu.

    Ekran Zagroenie bezpieczestwa ### security.gif

    Dostarczenie argumentw

    Jeli program jest aplikacj, to zazwyczaj oczekuje argumentw skojarzonych z parametrami funkcji main. W celu ich dostarczenia, naley wyda polecenie Project/Arguments. Spowoduje to wywietlenie dialogu Run arguments, pokazanego na ekranie Dostarczenie argumentw. W okienku dialogu mona poda wymagane argumenty aplikacji.

    Ekran Dostarczenie argumentw ### giveargs.gif

    Wykonanie programu

  • 20

    W celu wykonania programu naley w okienku Build klikn ikon Excecute Program. Jeli program jest aplikacj, to nastpi wwczas podjcie wykonania publicznej i statycznej funkcji main. Jeli jest apletem, to nastpi zinterpretowanie dokumentu HTML wchodzcego w skad projektu i wywietlenie opisanych w nim apletw.

    Jeli po aktywowaniu programu nastpi wyadowanie i zaadowanie Cafe, bez moliwoci zaobserwowania czegokolwiek, to zapewne

    1) Program jest aplikacj, ale nie wyposaono go w statyczn i publiczn funkcj main zawart w klasie, ktra jest publiczna. 2) Program jest aplikacj, ktra wyprowadza wyniki na konsol, ale nie zapewniono moliwoci obejrzenia konsoli

    (zazwyczaj pomaga System.in.read()).

    3) Program jest apletem, ale nie zawiera publicznej nadklasy klasy Applet.

    4) Program jest apletem, ale jego nazwa podana w opisie apletu (np. Master.class) nie wynika z nazwy klasy apletu (np.

    Master).

    5) Wykonanie programu doprowadzio do wysania nieobsuonego wyjtku.

    Jeli po aktywowaniu apletu zniknie rodowisko Cafe, ale nic si nie wywietli, to najprawdopodobniejsz tego przyczyn jest bd w opisie apletu, na przykad brak zamykajcego nawiasu ktowego w opisie apletu albo bdna nazwa parametru (np. lenght zamiast length).

    Uwaga: W systemie Windows 95 naley w takim wypadku nacisn klawisze Ctrl-Alt-Del, wyszuka program Appletviewer, a nastpnie wyda polecenie End Task. Spowoduje to powrt do rodowiska Cafe.

    Jeli po wykonaniu aplikacji nie pojawi si oczekiwany napis, to zapewne nie spowodowano wymiecenia bufora wyjciowego konsoli, tj. zapomniano, e po wykonaniu sekwencji instrukcji System.out.print(exp);

    naley wykona instrukcj System.out.println();

    Uruchomienie programu

    Podczas uruchamiania programw posugiwaem si wasn klasa uruchomieniow, przytoczon w Dodatku Klasa uruchomieniowa. Okazaa si ona bardzo przydatna, dlatego szczerze zachcam do jej uycia. Ci, ktry oczekuj wikszego komfortu mog uy uruchamiacza wbudowanego w Cafe. Posugiwanie si nim jest na tyle proste, e nie wymaga dodatkowych wyjanie.

    Na ekranie Uruchamianie pokazano wykonanie programu posugujcego si klas Debug. Wywietlenie jego moduu rdowego zapewniono dziki aktywowaniu dodatkowej kopii rodowiska Cafe, w ktrym otwarto plik zawierajcy ten modu.

    Ekran Uruchamianie ### debugger.gif

    Przykad Wysanie nieobsuonego wyjtku import java.io.IOException;

    import java.awt.*;

    public

    class Master {

    static {

    new Debug(); // por. Dodatek Klasa uruchomieniowa

    }

    public static void main(String args[])

    {

    div(1, 0);

    System.in.read();

    }

    static void div(int num, int den)

    {

    System.out.println(num / den);

    }

    }

  • 21

    Wykonanie programu powoduje wysanie wyjtku klasy ArithmeticException, a na skutek nie obsuenia go, wyprowadzenie do okna konsoli napisu

    java.lang.ArithmeticException: / by zero

    at Master.div(Master.java:17)

    at Master.main(Master.java:12)

    Z analizy napisu wynika, e bd "dzielenie przez 0" (/ by zero) wystpi w 17. wierszu funkcji sub, wywoanej z 12. wiersza funkcji main.

    W wykryciu bdu okazaa si pomocna klasa Debug opisana w Dodatku Klasa uruchomieniowa.

    ________________________________________________________________________________________

    Programowanie wizualne

    Programowanie wizualne polega na uyciu generatora do wytworzenia kodu obsugujcego graficznie zaprojektowane oblicze programu. Wygenerowanie programu jest atwe, ale na og czyni program duszym i mniej wydajnym.

    Nastpujcy aplet, utworzony za pomoc generatora programw, pokazany podczas wykonania na ekranie Programowanie wizualne, umoliwia zapoznanie si z kolorami o podanych skadnikach RGB (red, green, blue).

    Ekran Programowanie wizualne ### visual.gif

    Przykad Program wygenerowany

    Master

    =================================================

    import java.applet.*;

    import java.awt.*;

    public class Master extends Applet {

    private int red, green, blue;

    public void init()

    {

    super.init();

    //{{INIT_CONTROLS

    setLayout(null);

    resize(303, 133);

    panel = new Panel();

    panel.setLayout(null);

    add(panel);

    panel.reshape(14, 39, 66, 43);

    redEdit = new TextField(7);

    add(redEdit);

    redEdit.reshape(106, 18, 58, 20);

    greenEdit = new TextField(7);

    add(greenEdit);

    greenEdit.reshape(106, 54, 58, 20);

    blueEdit = new TextField(7);

    add(blueEdit);

    blueEdit.reshape(106, 90, 58, 20);

    redLabel = new Label("Red");

    add(redLabel);

    redLabel.reshape(161, 20, 47, 17);

    greenLabel = new Label("Green");

    add(greenLabel);

    greenLabel.reshape(161, 56, 47, 17);

    blueLabel = new Label("Blue");

    add(blueLabel);

    blueLabel.reshape(161,92,47,17);

    exitButton = new Button("Exit");

  • 22

    exitButton.setFont(new Font("Helvetica",

    Font.BOLD,10));

    add(exitButton);

    exitButton.reshape(232, 3, 67, 19);

    //}}

    }

    public void paint(Graphics gDC)

    {

    Rectangle b = panel.bounds();

    gDC.drawRect(b.x-1, b.y-1,

    b.width+1, b.height+1);

    }

    public boolean handleEvent(Event evt)

    {

    if (evt.id == Event.ACTION_EVENT &&

    evt.target == redEdit) {

    redEnter(evt);

    return true;

    }

    else if (evt.id == Event.ACTION_EVENT &&

    evt.target == greenEdit) {

    greenEnter(evt);

    return true;

    }

    else if (evt.id == Event.ACTION_EVENT &&

    evt.target == blueEdit) {

    blueEnter(evt);

    return true;

    }

    else if (evt.id == Event.ACTION_EVENT &&

    evt.target == exitButton) {

    clickedExitButton();

    return true;

    }

    return super.handleEvent(evt);

    }

    //{{DECLARE_CONTROLS

    Panel panel;

    TextField redEdit;

    TextField greenEdit;

    TextField blueEdit;

    Label redLabel;

    Label greenLabel;

    Label blueLabel;

    Button exitButton;

    //}}

    public void clickedExitButton()

    {

    // to do: put event handler code here.

    System.exit(0);

    }

    public void redEnter(Event evt)

    {

    // to do: put event handler code here.

    showColor(red = rgb(evt), green, blue);

    }

    public void greenEnter(Event evt)

    {

    // to do: put event handler code here.

    showColor(red, green = rgb(evt), blue);

    }

    public void blueEnter(Event evt)

    {

    // to do: put event handler code here.

    showColor(red, green, blue = rgb(evt));

    }

    int rgb(Event evt)

    {

    return Integer.parseInt((String)evt.arg);

    }

    void showColor(int r, int g, int b)

    {

    Color color = new Color(r, g, b);

  • 23

    panel.setBackground(color);

    panel.repaint();

    }

    }

    Generowanie programu

    W celu wywoania generatora naley wyda polecenie Tools/AppExpress. Spowoduje to wywietlenie okna dialogowego pokazanego na ekranie Generator programu.

    Bezporednio po wywoaniu generatora jest w nim wyrniony przycisk Application Type oraz zwizany z nim zestaw przyciskw Applications. Umoliwiaj one okrelenie, czy program ma by apletem czy aplikacj.

    Uwaga: Dalszy opis dotyczy generowania apletu zdefiniowanego przez klas o arbitralnie wybranej nazwie Master.

    Ekran Generator programu ### apptype.gif

    Po naciniciu przycisku Select Directory wywietli si okno pokazane na ekranie Wybranie katalogu. Naley w nim okreli nazw katalogu, w ktrym ma by wygenerowany program.

    Ekran Wybranie katalogu ### catalog.gif

    Po naciniciu przycisku Miscellaneous wywietli si okno pokazane na ekranie Nazwa projektu. Naley w nim poda nazw projektu (Master). Odbywa si to przez wypenienie klatki Project Name

    Ekran Nazwa projektu ### prjname.gif

    Po naciniciu przycisku Finish nastpi wygenerowanie programu aplikacji.

    Projektowanie oblicza

    W celu zaprojektowania oblicza graficznego programu naley wyda polecenie Resource/Open, a w wywietlonym wwczas oknie dialogowym wybra nazw pliku z rozszerzeniem .rc (Master.rc). Spowoduje to wywietlenie okna, w ktrym po klikniciu pozycji Form i Master.init pojawi si ramka, pokazana na ekranie Pulpit apletu.

    Ekran Pulpit apletu ### pulpit.gif

    Zapenienie ramki sterownikami odbywa si za pomoc narzdzi zawartych w ramce narzdziowej. Po klikniciu narzdzia i przecigniciu kursora w obrbie pulpitu nastpuje wykrelenie sterownika. Zestawy sterownikw mog by rozmieszczane na pulpicie za pomoc narzdzi wyszczeglnionych na pasku narzdziowym okna zasobw.

    Na ekranie Sterowniki apletu pokazano przykadowe rozmieszczenie sterownikw Label, TextField i Panel.

    Ekran Sterowniki apletu ### controls.gif

    Okrelanie waciwoci

    Po naniesieniu sterownikw i pojemnikw na pulpit, naley okreli ich waciwoci: nazwy i opisy (Member, Caption), wygld (Look) i reakcje (Events).

    Na ekranach Nazwa przycisku, Wygld przycisku i Reakcja przycisku pokazano sposb okrelenia waciwoci dla przycisku opatrzonego napisem Exit.

    Ekran Nazwa przycisku ### member.gif

    Ekran Wygld przycisku ### look.gif

  • 24

    Ekran Reakcja przycisku ### events.gif

    Po wybraniu zdarzenia dotyczcego sterownika (np. clicked) i naciniciu przycisku Edit, zostanie wywietlone okno Class Editor, pokazane na ekranie Zdefiniowanie obsugi. W oknie tym mona okreli sposb reagowania sterownika na zdarzenie.

    Ekran Zdefiniowanie obsugi ### handler.gif

    Komponowanie programu

    Po wykonaniu podanych czynnoci dla wszystkich komponentw pulpitu, a nastpnie zamkniciu okna do projektowania zasobw, otrzymuje si gotowy program, ktry moe by poddany dodatkowej rcznej obrbce (m.in. skopiowaniu komentarza zawierajcego opis apletu do pliku z rozszerzeniem .html).

    Wygenerowany wizualnie program naley oczywicie zbudowa, uruchomi i wytestowa. Czynnoci te wykonuje si w identyczny sposb jak dla programu utworzonego rcznie.

  • 25

    Cz III Podstawy programowania

    Program rdowy jest zestawem napisw umieszczonych w moduach rdowych. Kady modu rdowy jest umieszczony w pliku.

    Modu rdowy skada si z komentarzy, deklaracji pakietu, deklaracji importu i definicji klas. Jeli modu rdowy zawiera definicj wicej ni jednej klasy, to tylko jedna z nich moe by publiczna. Klasa publiczna o nazwie Class musi by umieszczona w pliku o nazwie Class.java.

    Po skompilowaniu moduu rdowego powstaje modu wynikowy z rozszerzeniem .class. Z takich wanie moduw, po uzupenieniu ich moduami bibliotecznymi pochodzcymi z pliku classes.zip tworzy si program wynikowy.

    _________________________________________________________________________________________

    Leksemy

    Modu rdowy skada si z odstpw i komentarzy oraz z sekwencji leksemw: sw kluczowych, identyfikatorw, operatorw i ogranicznikw.

    Sowa kluczowe

    Sowo kluczowe jest napisem sucym do zapisywania instrukcji programu. Do najczciej uywanych sw kluczowych nale int double

    if else while for

    Na przykad int age; // wiek

    // ...

    if(age >= 18) // jeli skoczye 18 lat

    youCanVote(); // moesz gosowa

    else // w przeciwnym razie

    youMustWait(); // musisz zaczeka

    Deklaracja zmiennej age zawiera sowo kluczowe int.

    Instrukcja warunkowa zawiera sowa kluczowe if i else.

    Literay

    Literaem jest nazwa zmiennej, ktrej warto i typ wynikaj z zapisu literau. Literaami s liczby cakowite (np. 12), liczby rzeczywiste (np. 1.2e+2), znaki (np. ('a') i acuchy (np. "Yes").

    Liczby cakowite

    Liczba cakowita dziesitna skada si z cigu cyfr dziesitnych. Liczba cakowita szesnastkowa skada si z napisu 0x po ktrym nastpuje cig cyfr szesnastkowych. Wartoci liczb typu "int" nale do przedziau 0 .. +9,223,372,036,854,775,807

    Na przykad

    12 liczba cakowita dziesitna (warto: 12) 0xc liczba cakowita szesnastkowa (warto: 12) -12 wyraenie cakowite

  • 26

    Liczby rzeczywiste

    Liczba rzeczywista skada si z dwch cigw cyfr dziesitnych oddzielonych kropk, po ktrych moe wystpi litera e z wykadnikiem.

    Cig cyfr przed albo po kropce moe by pominity. Kropk mona pomin tylko wwczas, gdy liczb zapisano z wykadnikiem albo gdy po liczbie wystpuje litera f. Wykadnik ma posta liczby cakowitej, ewentualnie poprzedzonej znakiem + (plus) albo - (minus).

    Wartoci liczb typu "double" nale do przedziau 0 .. 1.8e308

    Na przykad

    1.2 liczba rzeczywista (warto: 1.2) 3e-2 liczba rzeczywista (warto: 0.03) -1.2 wyraenie rzeczywiste

    Znaki

    Litera znakowy ma posta 'c' w ktrej c jest znakiem widocznym (np. 'a'), symbolem znaku (np. '\n'), albo szesnastkowym kodem znaku (np. '\u0061'). Wartoci literau znakowego jest kod opisanego przeze znaku (np. wartoci literau 'a' jest 97).

    W tabeli Symbole znakw wymieniono kilka waniejszych literaw znakowych.

    Tabela Symbole znakw ###

    Znak Interpretacja

    '\n' znak nowego wiersza

    '\r' znak powrotu karetki

    '\0' znak o kodzie 0

    '\t' znak tabulacji

    '\\' znak \

    '\'' znak ' (krcej: ''') '\"' znak " (krcej: '"') ###

    acuchy

    acuchem jest napis "cc ... c", w ktrym kade c jest takim samym napisem jak w literale znakowym. Litera acuchowy skadajcy si z N znakw jest nazw odnonika do wektora o N+1 elementach typu "char", zainicjowanych kodami kolejnych znakw acucha oraz dodatkowo kodem znaku '\0' (liczb 0).

    Na przykad

    "Yes" nazwa odnonika do wektora zainicjowanego kodami znakw Y, e, s oraz kodem znaku '\0' (liczb 0) "" nazwa odnonika do 1-elementowego wektora zainicjowanego kodem znaku '\0'

    Identyfikatory

    Identyfikator jest napisem reprezentujcym element programu: pakiet, klas, procedur albo zmienn. Identyfikatory mog skada si tylko z liter i cyfr (dolar i podkrelenie s uznawane za litery), ale nie mog zaczyna si od cyfry.

    Liczba znakw identyfikatora nie jest ograniczona. Identyfikator nie moe skada si z takich samych znakw jak sowo kluczowe.

    Identyfikatorami s m.in. napisy forSale ForSale forsale For_Sale $forSale

  • 27

    Nie jest identyfikatorem napis

    4sale

    Operatory

    Operatorami s cigi znakw, suce do zapisywania operacji. Do najczciej uywanych operacji nale m.in.:

    operacje arytmetyczne

    + (dodawanie), - (odejmowanie),

    * (mnoenie), / (dzielenie), ++ (zwikszenie o 1) -- (zmniejszenie o 1) += (dodanie) -= (odjcie) *= (pomnoenie) /= (podzielenie)

    porwnania

    == (rwne) != (nie rwne), < (mniejsze) > (wiksze), = (wiksze lub rwne)

    operacje logiczne

    ! (negacja)

    && (koniunkcja) || (dysjunkcja)

    Na przykad int num = 5, var = 7;

    var += -num++ / 2;

    System.out.println(var); // 5

    System.out.println(num); // 6

    Instrukcja

    var += -num++ / 2;

    zawiera operatory

    ++ - / +=

    Wartoci kolejnych podwyrae s nastpujce num 5

    num++ 5

    -num++ -5

    -num++ / 2 -2

    A zatem do zmiennej var dodaje si -2, czyli nadaje si jej warto 5.

    Ograniczniki

    Ogranicznikami s pojedyncze znaki oddzielajce albo koczce elementy programu. Najczciej uywanymi ogranicznikami s przecinki i redniki.

    Na przykad for(int suma = 0, i = 0; i < 100 ; i++)

    suma = suma + i;

    Przytoczona instrukcja zawiera 6 ogranicznikw (dwa nawiasy, przecinek i trzy redniki).

  • 28

    _________________________________________________________________________________________

    Zmienne

    Zmienna jest elementem programu wynikowego. W programie rdowym wystpuje pod postaci identyfikatora (np. var), literau (np. 12, 3.4, 'a', "Hello"), albo wyraenia (np. a+1).

    Zmienne mog by modyfikowalne albo niemodyfikowalne. Zmiennym modyfikowalnym mona, a zmiennym niemodyfikowalnym nie mona przypisywa danych. Zmienne niemodyfikowalne mog by nazywane staymi.

    Uwaga: Zapis literau uznaje si za niejawn deklaracj reprezentowanej przeze zmiennej. Wszystkie pozostae zmienne musz by zadeklarowane jawnie, albo musz powsta jako rezultat wykonania operacji na zmiennych. W szczeglnoci kade wyraenie jest chwilow nazw pewnej zmiennej.

    Na przykad int var;

    // ...

    var = var + 2;

    Identyfikator var jest nazw zmiennej typu "int".

    Wyraenie var + 2

    jest chwilow nazw rezultatu operacji dodawania.

    Wyraenie var = var + 2

    jest chwilow nazw rezultatu operacji przypisania.

    Identyfikowanie zmiennych

    Do identyfikowania zmiennych su ich nazwy. Nazw zmiennej modyfikowalnej jest identyfikator, a nazw zmiennej niemodyfikowalnej litera. Wyraenie jest nazw zmiennej modyfikowalnej tylko wwczas, gdy jest l-nazw.

    O tym, czy rezultat operacji jest czy nie jest l-nazw decyduje opis operacji. Decyzje takie zostay podjte arbitralnie przez twrcw jzyka. W szczeglnoci jest l-nazw kady identyfikator zmiennej (z wyjtkiem odnonika this), ale nie jest ni wyraenie arytmetyczne (np. 2 + 3), ani nazwa rezultatu przypisania (np. a = 12)

    Uwaga: Okrelenie l-nazwa bierze si std, e tylko taka nazwa zmiennej moe wystpi jako lewy argument operacji przypisania.

    Na przykad int var = 12;

    ++++var; // bd (++var nie jest l-nazw)

    (var = 2) = 3; // bd (var = 2 nie jest l-nazw)

    this = null // bd (this nie jest l-nazw)

    Modyfikowanie zmiennych

    Modyfikowanie zmiennych odbywa si za pomoc operacji przypisania oraz za pomoc operacji wejcia.

    Na przykad int chr, fix;

    fix = 'a';

    // ...

    chr = System.in.read();

    Zmienna fix jest modyfikowana za pomoc operacji przypisania, a zmienna chr jest modyfikowana za pomoc operacji wejcia.

  • 29

    Przeksztacanie zmiennych

    Do przeksztacenia zmiennej w inn zmienn suy konwersja. Konwersja, ktra moe by zastosowana niejawnie jest konwersj standardow.

    Konwersja standardowa jest konwersj dopuszczaln (poprawn skadniowo), ale nie musi by konwersj wykonaln (poprawn semantycznie).

    Wyraenie poddane konwersji zapisuje si w postaci (Type)exp

    w ktrej Type jest nazw typu docelowego (najczciej identyfikatorem typu), a exp jest wyraeniem, ktre mona podda konwersji do typu "Type".

    Uwaga: Nazwa zmiennej, ktra jest rezultatem konwersji nie jest l-nazw.

    Na przykad int num = (int)12.0; // dobrze (jawna konwersja)

    double dbl = 12; // dobrze (niejawna konwersja)

    int fix = 12.0; // bd (brak jawnej konwersji)

    (int)fix = 12; // bd ((int)Fix nie jest l-nazw)

    Promocje

    Przed wykonaniem pewnych operacji jednoargumentowych jest wykonywana promocja do typu oglniejszego (np. z typu "char" do typu "int"). Takie przeksztacenie jest wykonywane niejawnie.

    Na przykad char chr = 'a';

    System.out.print(chr); // a

    System.out.print((int)chr); // 97

    System.out.print(+chr); // 97

    Przed wykonaniem operacji +chr dokonano promocji z typu "char" do typu "int".

    Typ wsplny

    Przed wykonaniem pewnych operacji dwuargumentowych jest wykonywane przeksztacenie argumentw do najwszego typu oglniejszego, stanowicego wwczas typ wsplny argumentw. Przeksztacenie takie jest wykonywane niejawnie.

    Na przykad char chr = 'a'; // 0000 0000 0110 0001

    System.out.print((int)chr & 0x21); // 33

    System.out.print(chr & 0x21); // 33

    Przed wykonaniem operacji chr & 0x21 przeksztacono argument chr do typu wsplnego "int".

    _________________________________________________________________________________________

    Zmienne orzecznikowe

    Zmiennymi orzecznikowymi (krtko: orzecznikami) s zmienne typu "boolean". Zmiennym orzecznikowym mona przypisywa orzeczenia reprezentujce prawd (true) albo fasz (false).

    Na orzecznikach mona wykonywa operacje negacji (!), koniunkcji (&&) i dysjunkcji (||). Operacja negacji jest jednoargumentowa, a operacje koniunkcji i dysjunkcji s dwuargumentowe.

  • 30

    Negacja

    Jeli var jest orzecznikiem o wartoci false, to rezultatem operacji !var jest orzecznik o wartoci true.

    Jeli var jest orzecznikiem o wartoci true, to rezultatem operacji !var jest orzecznik o wartoci false.

    Na przykad boolean var = false;

    var = !var;

    Po opracowaniu deklaracji, orzecznik var ma warto false.

    Po opracowaniu przypisania, orzecznik var ma warto true.

    Koniunkcja

    Koniunkcja dwch argumentw ma warto true tylko wwczas, gdy kady z nich ma warto true. Jeli lewy argument ma warto false, to rezygnuje si z opracowania prawego.

    Na przykad boolean one = true,

    two = false;

    boolean var;

    var = one && two;

    two = var && fun();

    Zmiennej var przypisano warto false.

    Podczas wykonywania ostatniej instrukcji nie dojdzie do wykonania funkcji fun.

    Dysjunkcja

    Dysjunkcja dwch argumentw ma warto false tylko wwczas, gdy kady z nich ma warto false. Jeli lewy argument ma warto true, to rezygnuje si z opracowania prawego.

    Na przykad boolean one = true,

    two = false;

    boolean var;

    var = one || fun();

    Zmiennej var przypisano warto true.

    Podczas wykonywania ostatniej instrukcji nie dojdzie do wykonania funkcji fun.

    _________________________________________________________________________________________

    Zmienne arytmetyczne

    Zmiennymi arytmetycznymi s zmienne cakowite (np. typu "int") i rzeczywiste (np. typu "double").

    Na zmiennych arytmetycznych mona wykonywa podstawowe dziaania arytmetyczne: dodawanie, odejmowanie, mnoenie i dzielenie, operacje zwikszenia i zmniejszenia wartoci o 1 oraz operacje porwania.

    Zmienne cakowite

    Najczciej uywanymi zmiennymi cakowitymi s 4-bajtowe zmienne typu "int". Mona w nich przechowywa dane liczbowe z przedziau

  • 31

    -2,147,483,648 .. 2,147,483,647

    Rzadziej s uywane zmienne cakowite typu "byte", "short" i "long". Zakresy ich wartoci przytoczono w tabeli Pozostae zmienne cakowite.

    Uwaga: Nie ma literaw typu "byte" i "short". Litera typu "long" ma posta literau typu "int" zakoczonego liter L albo l (np. 12L).

    Tabela Pozostae zmienne cakowite ###

    Typ Rozmiar Wartoci

    byte 1-bajt (od -128 do 127)

    short 2-bajty (od -32768 do 32767)

    long 8-bajtw (od -9,223,372,036,854,775,808 do +9,223,372,036,854,775,807) ###

    Zmienne rzeczywiste Najczciej uywanymi zmiennymi rzeczywistymi s 8-bajtowe zmienne typu "double". Mona w nich przechowywa dane liczbowe z przedziau

    -1.8e308 .. 1.8e308

    Rzadziej s uywane 4-bajtowe zmienne typu "float". Mona w nich przechowywa dane liczbowe z przedziau

    -3.4e38 .. 3.4e38

    Uwaga: Litera typu "float" ma posta literau typu "int" albo "double" zakoczonego liter F albo f (np. 12f).

    Podstawowe dziaania arytmetyczne

    Rezultatem podstawowego dziaania arytmetycznego jest zmienna arytmetyczna o wartoci okrelonej przez to dziaanie. Jeli operacja jest dwuargumentowa, a jeden z argumentw jest typu "double", to i rezultat operacji jest typu "double".

    Na przykad int fix = 12;

    double dbl = 3.4;

    double var;

    var = fix + dbl;

    Zmiennej var przypisano dan typu "double" o wartoci 15.4.

    Uwaga: Jeli zmienna arytmetyczna jest poczona operatorem + (plus) ze zmienn acuchow, to zmienna arytmetyczna jest przeksztacana w acuchow, a nastpnie tworzy si zmienn acuchow skadajc si z wszystkich znakw obu acuchw.

    W szczeglnoci, rezultatem operacji "" + 12

    jest "12", rezultatem operacji

    "" + 2 + 3

    jest "23", a rezultatem operacji

    "Wynik: " + (2 + 3)

    jest "Wynik: 5"

  • 32

    Operacje zwikszenia i zmniejszenia

    Rezultatem nastpnikowej operacji zwikszenia (++) jest zmienna o takiej wartoci jak ma argument operacji. Skutkiem ubocznym operacji zwikszenia jest dodanie do argumentu liczby 1.

    Rezultatem nastpnikowej operacji zmniejszenia (--) jest zmienna o takiej wartoci jak ma argument operacji. Skutkiem ubocznym operacji zmniejszenia jest odjcie od argumentu liczby 1.

    Na przykad int fix = 12;

    int num = fix++;

    fix = num--;

    Tu przed wykonaniem ostatniej instrukcji zmienna fix oraz zmienna num ma warto 12.

    Tu po wykonaniu ostatniej instrukcji zmienna fix ma wartoc 12, a zmienna num ma warto 11.

    Operacje porwnania

    Rezultatem operacji porwnania: == (rwne), != (nie rwne), < (mniejsze), > (wiksze), = (wiksze lub rwne) jest orzecznik o wartoci okrelajcej prawdziwo porwnania (np. 12 > 10 ma warto true).

    Uwaga: Specjalnej ostronoci wymaga uycie operatora rwne. Jeli zapomni si o tym, e skada si z pary znakw rwnoci, to faktycznie stanie si operatorem przypisania.

    Na przykad int fix;

    // ...

    if(fix >= 100 && fix

  • 33

    // ...

    if(chr >= 'a' && chr

  • 34

    public boolean equals(Object obj)

    Rezultatem metody equals uytej w wyraeniu str1.equals(str2)

    jest orzecznik o wartoci true jeli odnoniki str1 i str2 identyfikuj zmienne acuchowe zainicjowane takimi samymi acuchami. W przeciwnym razie orzecznik ma warto false.

    Na przykad String str = "$";

    String one = str + "100";

    String two = str + "100";

    System.out.println(one == two); // false

    System.out.println(one.equals(two)); // true

    public int compareTo(String str)

    Rezultatem metody compareTo uytej w wyraeniu str1.compareTo(str2)

    jest zmienna typu "int" o wartoci ujemnej, zero, albo dodatniej, odpowiednio do tego czy odnoniki str1 i str2 identyfikuj zmienne zainicjowane takimi acuchami, e pierwszy jest mniejszy od drugiego, oba s rwne, albo pierwszy jest wikszy od drugiego.

    Na przykad String one;

    String two;

    // ...

    int res = one.compareTo(two);

    if(res < 0)

    System.out.println("Pierwszy acuch jest mniejszy");

    if(res == 0)

    System.out.println("acuchy s rwne");

    if(res > 0)

    System.out.println("Pierwszy acuch jest wikszy");

    Jeli tu przed uyciem metody compareTo wykonano instrukcje one = "ABC";

    two = "Ab";

    to poniewa kod litery b (98) jest wikszy od kodu litery B (42), wic nastpi wyprowadzenie napisu Pierwszy acuch jest mniejszy

    _________________________________________________________________________________________

    Instrukcje

    Instrukcja jest opisem czynnoci. Kada instrukcja moe by poprzedzona etykiet (albo wicej ni jedn etykiet). Etykieta ma posta identyfikatora, a od instrukcji (albo od etykiety) oddziela j znak : (dwukropek).

    Na przykad void sub(int par)

    {

    Lab: // etykieta

    while(true)

    if(par++ < 0)

    break Lab; // odwoanie do etykiety

    }

  • 35

    Instrukcja deklaracyjna

    Instrukcja deklaracyjna ma posta spec dcl, dcl, ... , dcl;

    w ktrej spec jest zestawem specyfikatorw, a kade dcl jest deklaratorem zmiennej albo deklaratorem z inicjatorem.

    Specyfikatory Specyfikatory su do okrelenia typu zmiennych i rezultatw procedur, a ponadto okrelaj dodatkowe atrybuty zmiennych, procedur i klas, takie jak

    dostpno private, protected, public statyczno static rodzimo native ustalono final synchroniczno synchronized ulotno volatile nietrwao transient

    Na przykad public final

    class Master {

    public static final double Pi = 3.14;

    // ...

    }

    Klasa Master jest publiczna (dostpna z wszystkich klas) i ustalona (nie moe by podklas innej klasy).

    Zmienna Pi jest publiczna (dostpna z wszystkich klas), statyczna (istnieje od chwili zaadowania do chwili wyadowania klasy) i ustalona (nie moe by modyfikowana).

    Deklaratory Deklarator suy do okrelenia nazwy zmiennej. Jeli zmienna jest odnonikiem do tablicy, to deklarator zawiera informacj o liczbie jej wymiarw.

    Uwaga: Sposb rozmieszczenia par nawiasw kwadratowych okrelajcych liczb wymiarw tablicy jest dowolny. W obrbie nawiasw kwadratowych nie moe wystpi aden napis.

    Na przykad int var;

    int vec[];

    String[] arr[]; // String arr[][]; String [][]arr;

    int mtx[2][] // bd (liczba w obrbie nawiasw)

    Deklaratorami s var, vec[] i []arr[]. Identyfikator vec jest nazw zmiennej typu "int", a identyfikatory vec i arr s nazwami odnonikw do tablic zmiennych, odpowiednio 1-wymiarowej i 2-wymiarowej (wynika to z liczby par nawiasw kwadratowych).

    Inicjatory Inicjator deklaratora moe mie jedn z nastpujcych postaci = exp inicjator wyraeniowy

    = { phi, phi, ... , phi } inicjator klamrowy

    w ktrych exp jest wyraeniem a kade phi jest wyraeniem, albo fraz inicjujc o postaci { phi, phi, ... , phi }

    Opracowanie instrukcji deklaracyjnej powoduje zadeklarowanie wymienionych w niej zmiennych oraz ewentualne zainicjowanie

    ich wartociami wyrae wymienionych w inicjatorach.

  • 36

    Uwaga: Inicjator klamrowy moe by uyty tylko do inicjowania tablic.

    Przykad Instrukcje deklaracyjne int varA;

    int varB = 10;

    int var1, var2 = 20, var3;

    int lotto[] = { 12, 45, 6, 32, 18, 5 };

    String monolog[] = { "To", "be", "or", "not", "to", "be" };

    int matrix[][] = {

    { 10, 20, 30, 40 },

    { 20, 30, 40, 50 },

    { 30, 40, 50, 60 }

    };

    int var5(50); // bd (niewaciwy inicjator)

    int varC = { 10 }; // bd (niewaciwy inicjator)

    Zmienna matrix jest odnonikiem do 2-wymiarowej tablicy o 2 wierszach i 4 kolumnach.

    Zakres deklaracji

    W punkcie bezporednio za deklaratorem zaczyna si zakres deklaracji zmiennej. Koczy si on w miejscu zakoczenia najwszego bloku, w ktrym wystpia ta deklaracja.

    Uwaga: Blokiem jest fragment programu zawarty midzy par odpowiadajcych sobie nawiasw klamrowych.

    Na przykad import java.io.IOException;

    public

    class Master {

    public static void main(String args[])

    throws IOException

    {

    if(args.length > 0) {

    String allArgs = "";

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

    System.out.println(

    "Argument #" + i + ": " + args[i]

    );

    allArgs += args[i] + ' ';

    }

    System.out.println("All arguments: " + allArgs);

    } else

    System.out.println("Program was called " +

    "with no arguments!");

    System.in.read();

    }

    }

    W programie wystpuj 4 wzajemnie zawierajce si bloki.

    Wykonanie programu powoduje wyszczeglnienie jego argumentw, na przykad Argument #0: Ewa

    Argument #1: Jan

    All arguments: Ewa Jan

    albo wyprowadzenie napisu

    Program was called with no arguments!

    Kolidowanie deklaracji

    W zakresie deklaracji zmiennej nie moe wystpi deklaracja zmiennej oznaczonej takim samym identyfikatorem.

  • 37

    Przykad Kolidowanie deklaracji void sub(int age)

    {

    System.out.println(age);

    {

    int age = 12; // bd (kolizja z parametrem)

    // ...

    {

    int age = 20; // bd (dodatkowa kolizja)

    String name = "Bob";

    // ...

    }

    String name = "Tom";

    // ...

    for(int i = 0; i < 10 ; i++)

    // ...

    for(int i = 10; i > 0 ; i--)

    // ...

    }

    }

    Odnonik name identyfikujcy obiekt zainicjowany acuchem "Bob" nie koliduje z odnonikiem name identyfikujcym obiekt zainicjowany acuchem "Tom".

    Nie wystpuje kolizja midzy identyfikatorami i wystpujcymi w instrukcjach for.

    Instrukcja pusta

    Instrukcja pusta ma posta ;

    Jej wykonanie nie wywouje adnych skutkw.

    Przykad Instrukcja pusta void fun()

    {

    int i = 10000;

    JustLabel:

    ; // instrukcja pusta

    while(i-- != 0)

    ; // instrukcja pusta

    Fin: // bd (brak instrukcji pustej)

    }

    Instrukcja grupujca

    Instrukcja grupujca ma posta { Ins Ins ... Ins }

    w ktrej kade Ins jest dowoln instrukcj.

    Wykonanie instrukcji grupujcej skada si z sekwencyjnego wykonania zawartych w niej instrukcji Ins.

    Uwaga: Uycie instrukcji grupujcej ma na celu utworzenie z sekwencji instrukcji dokadnie jednej instrukcji.

    Przykad Instrukcje grupujce int i = -100;

    do {

    System.out.print(i++);

    i++;

    } while(i < 0);

  • 38

    do

    System.out.print(i++);

    i++; // bd (brak instrukcji grupujcej)

    while(i < 100);

    Midzy pierwsz par sw kluczowych do i while wystpuje instrukcja grupujca.

    Instrukcja wyraeniowa

    Instrukcja wyraeniowa ma posta

    exp;

    w ktrej exp jest wyraeniem.

    Wykonanie instrukcji wyraeniowej skada si z opracowania wyraenia exp, a nastpnie zignorowania rezultatu tego opracowania.

    Uwaga: Wykonanie instrukcji wyraeniowej powinno pociga za sob skutki uboczne, takie jak przypisywanie i przesyanie danych. W przeciwnym razie uycie jej jest zbyteczne.

    Przykady Instrukcje wyraeniowe int var;

    // ...

    var = 10; // przypisanie

    var1 = var2 = 10; // przypisanie

    var = System.in.read(); // przesanie

    System.in.read(); // przesanie

    System.out.println(var); // przesanie

    Instrukcja warunkowa

    Instrukcja warunkowa ma posta if(exp) InsT

    albo if(exp) InsT else InsF

    w ktrych exp jest wyraeniem orzecznikowym, a InsT oraz InsF jest instrukcj.

    Jeli InsT jest instrukcj warunkow, to obowizuje zasada, e kadej frazie else odpowiada najblisza z lewej, poprzedzajca j fraza if.

    W szczeglnoci, instrukcja if(exp1) if(exp2) Ins1 else Ins2

    jest rwnowana instrukcji if(exp1) { if(exp2) Ins1 else Ins2 }

    a nie instrukcji

    if(exp1) { if(exp2) Ins1 } else Ins2

    Wykonanie instrukcji warunkowej zaczyna si od wyznaczenia wartoci wyraenia exp. Jeli wyraenie ma warto true, to jest wykonywana instrukcja InsT, a w przeciwnym razie instrukcja InsF (o ile wystpuje). Po wykonaniu tych czynnoci wykonanie instrukcji warunkowej uznaje si za zakoczone.

    Przykad Instrukcje warunkowe if(var < 5 && var != 0)

    System.out.println(var);

  • 39

    if(flag || var >= 5)

    var = 0;

    else

    System.out.println(var);

    if(var >= 0) {

    if(var = 0)

    if(var = 0) {

    if(var

  • 40

    Dziki temu, po wykonaniu trzech obrotw ptli, nastpi zakoczenie wykonywania instrukcji while.

    Instrukcja for

    Instrukcja for ma posta for(Ins0 expC ; expI) Ins

    w ktrej Ins0 jest instrukcj wyraeniow albo deklaracyjn, expC jest wyraeniem orzecznikowym, expI jest wyraeniem, a Ins jest instrukcj.

    Wykonanie instrukcji for skada si z jednokrotnego wykonania instrukcji Ins0, a nastpnie z cyklicznego wykonywania nastpujcych czynnoci

    1. Opracowania i wyznaczenia wartoci wyraenia expC. 2. Jeli wyraenie expC ma warto true, wykonania instrukcji Ins oraz instrukcji wyraeniowej utworzonej z wyraenia

    expI.

    Jeli wyraenie expC ma warto false, to wykonanie instrukcji for uznaje si za zakoczone.

    Uwaga: Warto odnotowa, e wykonanie instrukcji for(Ins0 expC ; expI)

    Ins

    ma na og taki sam skutek jak wykonanie instrukcji Ins0

    while(expC) {

    Ins

    expI;

    }

    Przykad Instrukcja for for(int var = 0; var < 3 ; var++)

    System.out.println(var); // 0 1 2

    int var;

    for(var = 3; var > 0 ; var--)

    System.out.println(var); // 3 2 1

    Instrukcja do

    Instrukcja do ma posta do

    Ins

    while(exp);

    w ktrej Ins jest instrukcj, a exp jest wyraeniem orzecznikowym.

    Wykonanie instrukcji do skada si z cyklicznego wykonywania nastpujcych czynnoci

    1. Wykonania instrukcji Ins.

    2. Opracowania i wyznaczenia wartoci wyraenia exp. 3. Jeli wyraenie exp ma warto true, ponownego wykonania podanych czynnoci.

    Jeli wyraenie exp ma warto false, to wykonanie instrukcji do uznaje si za zakoczone.

    Uwaga: Instrukcja Ins jest wykonywana co najmniej jeden raz.

    Przykad Instrukcja do int val = 3;

    do

  • 41

    System.out.println(val); // 3 2 1 0

    while(val-- != 0);

    Poniewa badanie warunku odbywa si dopiero po wykonaniu instrukcji zawartej midzy do i while, wic liczba "obrotw" ptli do jest o 1 wiksza ni liczba obrotw podobnej do niej instrukcji while.

    Instrukcje zaniechania i kontynuowania

    We wntrzu ptli mog by uyte instrukcje break;

    oraz continue;

    Wykonanie instrukcji zaniechania (break) powoduje zakoczenie wykonywania ptli, natomiast wykonanie instrukcji kontynuowania (continue) powoduje wykonanie takich czynnoci, jakby zakoczyo si wykonywanie wszystkich instrukcji objtej ptl (co spowoduje kontynuowanie wykonywania ptli).

    Przykad Instrukcje break i continue int sum = 0;

    for(int i = 1; i 7)

    break;

    sum = sum + 2*i;

    }

    System.out.println("Sum = " + sum);

    Zmienna sum przyjmuje kolejno wartoci: -1, -2, 4, 12.

    Zakoczenie wykonywania ptli for nastpuje znacznie wczeniej ni wynikaoby z rozpatrzenia jej pierwszego wiersza.

    Wykonanie podanego wycinka programu powoduje wyprowadzenie napisu

    Sum = 12

    Uycie etykiet

    Instrukcje zaniechania i kontynuowania mog mie rwnie posta break Lab;

    oraz continue Lab;

    w ktrych Lab jest etykiet.

    W takim wypadku wykonanie instrukcji zaniechania powoduje zakoczenie wykonywania ptli poprzedzonej podan etykiet, a wykonanie instrukcji kontynuowania powoduje kontynuowanie wykonania ptli poprzedzonej podan etykiet.

    Przykad Instrukcja zaniechania z etykiet int arr[][] = {

    { 1, 2, 3 },

    { 4, 0, 5 },

    { 1, 1, 0 }

    };

    int sum = 0;

    Loop:

    for(int i = 0; i < 3 ; i++)

    for(int j = 0; j < 3 ; j++)

    if(arr[i][j] == 0)

    break Loop;

    else

  • 42

    sum += arr[i][j];

    System.out.println(sum);

    Ptla sumuje kolejne wiersze tablicy, ale koczy si w chwili napotkania elementu o wartoci 0.

    Wykonanie programu powoduje wyprowadzenie liczby 10.

    Gdyby z instrukcji zaniechania usunito etykiet, nastpioby wyprowadzenie liczby 12.

    Instrukcja wyboru

    Instrukcja wyboru ma na og posta switch(exp0) {

    Case Case ... Case Default

    }

    w ktrej kade Case jest fraz o postaci case exp: Ins Ins ... break;

    a Default jest fraz o postaci default: Ins Ins ... Ins

    W takim zapisie, exp0 jest wyraeniem cakowitym, kade exp jest wyraeniem staym cakowitym (zazwyczaj literaem albo symbolem), a kade Ins jest instrukcj, albo jest napisem pustym.

    Na przykad void sub(int par)

    throws IllegalArgumentException

    {

    switch(par) {

    case 0:

    System.out.print("0");

    break;

    case -1:

    System.out.print("-1");

    break;

    case +1:

    System.out.print("+1");

    break;

    default:

    System.out.print("Wrong value");

    throw new IllegalArgumentException();

    }

    System.out.println();

    }

    Wykonanie instrukcji wyboru zaczyna si od opracowania i wyznaczenia wartoci wyraenia exp0. Nastpnie warto tego wyraenia jest porwnywana z wartociami wyrae exp zawartych w kolejnych frazach Case, a do stwierdzenia rwnoci.

    W takim wypadku s wykonywane instrukcje danej frazy. W przeciwnym razie s wykonywane instrukcje frazy Default (domniemana fraza Default skada si z jednej instrukcji break;). Po zakoczeniu tych czynnoci wykonanie instrukcji wyboru uznaje si za zakoczone.

    Uwaga: Jeli frazy Case nie koczy instrukcja break;, to bezporednio po wykonaniu jej instrukcji Ins s wykonywane instrukcje nastpnych fraz, a do napotkania instrukcji zaniechania (break) bd powrotu (return), albo do koca instrukcji wyboru.

    Instrukcje powrotu

    Instrukcja powrotu ma posta return;

    albo

  • 43

    return exp;

    w ktrej exp jest wyraeniem.

    Wykonanie instrukcji powrotu powoduje zakoczenie wykonywania zawierajcej j procedury. Jeli procedura jest rezultatowa (jest typu rnego od "void"), to jej rezultat jest inicjowany wartoci wyraenia exp (po ewentualnej konwersji do typu rezultatu).

    Przykad Instrukcja powrotu static double fun(int par)

    {

    if(par > 0)

    return par * par; // return (double)(par * par);

    else

    return 0.0;

    }

    Jeli funkcja fun zostanie wywoana w instrukcji System.out.print(fun(2));

    to wartoci jej rezultatu bdzie 4.0.

    Instrukcja obsugi wyjtkw

    Instrukcja do obsugi wyjtkw ma posta try

    Block

    Catch

    Finally

    w ktrej Block jest instrukcj grupujc, Catch jest niepustym zestawem fraz catch(Dcl)

    Block

    w ktrych Dcl jest deklaracj parametru anonimowej funkcji do obsugiwania wyjtkw, a Finally jest nieobowizkow fraz finally

    Block

    Na przykad int len = 3, vec[];

    try {

    vec = new int [len];

    // ...

    }

    catch(OutOfMemoryError e) {

    // ...

    }

    catch(Exception e) {

    // ...

    }

    finally {

    vec = null;

    // ...

    }

    Wykonanie instrukcji try skada si z wykonania instrukcji grupujcej wystpujcej bezporednio po frazie try. Jeli podczas jej wykonywania wystpi sytuacja wyjtkowa (spowodowana na przykad brakiem pamici na stercie), to wykonanie instrukcji grupujcej uzna si za zakoczone, a wysany wwczas wyjtek (obiekt klasy wyjtku) zostanie odebrany i obsuony przez t pierwsz fraz catch, ktrej parametr mona skojarzy z wysanym wyjtkiem.

    Niezalenie od tego jaki by przebieg wykonania instrukcji try, ale bezporednio przed jej zakoczeniem, jest wykonywany blok frazy finally.

  • 44

    Jeli adna z fraz catch instrukcji try nie jest w stanie odebra wyjtku, to jest on wysyany do najwszej dynamicznie, obejmujcej j, instrukcji try. Jeli takiej nie ma, to domylnie nastpuje zakoczenie wykonywania programu.

    Uwaga: Jeli wystpienie sytuacji wyjtkowej spowoduje zaniechanie dalszego wykonywania jakiegokolwiek bloku programu, to nastpi niejawne zniszczenie wszystkich jeszcze nie zniszczonych jego zmiennych lokalnych.

    Na przykad import java.io.IOException;

    public

    class Master {

    public static void main(String args[])

    throws IOException

    {

    String str = fun("Hello");

    // ...

    System.in.read();

    }

    static String fun(String str)

    {

    try {

    int fix = 12;

    // ...

    return getStr(str);

    }

    catch(OutOfMemoryError e) {

    System.out.println("Buy more RAM!");

    System.exit(0);

    return null; // wymagane!

    }

    }

    static String getStr(String str)

    throws OutOfMemoryError

    {

    String strRef;

    try {

    strRef = new String(str);

    System.out.println(strRef.charAt(0));

    }

    catch(NullPointerException e) {

    System.exit(1);

    return null;

    }

    return strRef;

    }

    }

    Jeli podczas wykonywania instrukcji strRef = new String(str);

    zostaby wysany wyjtek klasy OutOfMemoryError, to poniewa nie mgby zosta odebrany przez fraz catch(NullPointerException e)

    wchodzc w skad instrukcji try funkcji getStr, wic zostaby wysany do dynamicznie obejmujcej j instrukcji try funkcji fun, gdzie zostaby przechwycony przez fraz catch(OutOfMemoryError e)

    Naley zwrci uwag, e tu po rozpatrzeniu fraz catch instrukcji try nalecej do funkcji getStr zostanie zniszczona zmienna strRef, a tu przed rozpatrzeniem fraz catch instrukcji try nalecej do funkcji fun zostanie zniszczona zmienna fix.

    ________________________________________________________________________________________

    Tablice

    Tablica jest wektorem elementw, z ktrych kady jest takiego samego typu. Elementami tablicy mog by tylko zmienne typu podstawowego oraz odnoniki do tablic i obiektw.

  • 45

    Z kadym elementem tablicy jest zwizany indeks, okrelajcy pozycj elementu w obrbie tablicy. Indeks pierwszego elementu ma warto 0.

    Przetwarzanie elementw tablicy odbywa si za porednictwem odnonika identyfikujcego tablic. Jeli nazw odnonika jest ref, to wyraenie ref[exp]

    w ktrym exp jest wyraeniem cakowitym, jest nazw elementu o indeksie rwnym wartoci wyraenia exp, za wyraenie ref.length

    jest nazw zmiennej o wartoci rwnej liczbie elementw tablicy.

    Elementy podstawowe

    Jeli Type jest nazw typu podstawowego (np. "int" albo "double"), to deklaracja Type ref[]

    oznajmia, e ref jest odnonikiem do wektora elementw typu podstawowego, z ktrych kady jest typu "Type".

    Podczas opracowania takiej deklaracji, odnonikowi ref jest przypisywane odniesienie puste. Odniesienie niepuste mona przypisa na dwa sposoby: albo za pomoc takiego inicjatora jak = { 10, 20, 30 }

    okrelajcego wartoci elementw, na przykad int vec[] = { 10, 20, 30 };

    albo za pomoc wyraenia fabrykujcego new Type [size]

    dostarczajcego odnonik do size-elementowego wektora, ktrego elementy maj wartoci 0, na przykad new int [width * height]

    A zatem, wykonanie nastpujcej instrukcji int arr[] = { 10, 20, 30 };

    moe by zastpione wykonaniem instrukcji int arr[];

    arr = new int [3];

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

    arr[i] = 10 * (i+1);

    Przykad Sumowanie elementw import java.io.IOException;

    public

    class Master {

    public static void main(String args[])

    throws IOException

    {

    int vec[] = { 10, 20, 30 };

    int sum = 0;

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

    sum = sum + vec[i];

    System.out.println("Sum = " + sum);

    System.in.read();

  • 46

    }

    }

    Wykonanie programu powoduje wyprowadzenie napisu

    Sum = 60

    Elementy odnonikowe

    Jeli Type jest nazw typu odnonikowego (np. "String" albo "StringBuffer"), to deklaracja Type ref[]

    oznajmia, e ref jest odnonikiem do wektora odnonikw, z ktrych kady jest typu "Type".

    Podczas opracowania takiej deklaracji, odnonikowi ref jest przypisywane odniesienie puste. Odniesienie niepuste mona przypisa na dwa sposoby: albo za pomoc takiego inicjatora klamrowego jak = { "Hello", "World" }

    okrelajcego wartoci elementw, na przykad String vec[] = { "Hello", "World" };

    albo za pomoc wyraenia fabrykujcego new Type [size]

    dostarczajcego odnonik do size-elementowego wektora, ktrego elementy maj wartoci null, na przykad new String [rows * cols]

    A zatem, wykonanie nastpujcej instrukcji String arr[] = { "Hello", "World" };

    moe by zastpione wykonaniem instrukcji String arr[];

    arr = new String [2];

    arr[0] = "Hello";

    arr[1] = "World";

    Przykad Wyznaczenie redniej argumentw import java.io.IOException;

    public

    class Master {

    public static void main(String args[])

    throws IOException, NumberFormatException

    {

    if(args.length == 0)

    System.out.println("Please supply arguments");

    System.in.read();

    return;

    }

    int sum = 0, count = args.length;

    for(int i = 0; i < count ; i++) {

    String arg = args[i];

    int val = Integer.parseInt(arg);

    sum = sum + val;

    }

    System.out.println(sum / count);

    S