Predavanje Java PDF

You might also like

You are on page 1of 69

Uvod

ta je program
Kako napisati pravilno program za raunar
Prednosti i mane korienja Jave
Kako program napisan u Javi promeniti u formu koju
svaki raunar razume
Primer Java koda i komentari

Uvod u programiranje 1 Java


Uvod

SI1P1 2004

1/15

Pisanje programa i spremanje hrane

SI1P1 2004

SI1P1 2004

2/15

Pisanje programa i spremanje hrane

3/15

SI1P1 2004

4/15

ta predstavlja raunarski program

Kompajliranje

Da bi raunar mogao da izvri odreene zadatke (na


primer odtampa ocene koje student dobije na ispitu),
moraju mmu se zadati instrukcije za obavljanje
zadatka
Skup instrukcija koje vode raunar da izvri odreeni
zadatak ine raunarski program
Mi piemo program (skup instrukcija) u programskim
jezicima kao to su C, Pascal ili Java
Koristimo ove programske jezike jer su razumljivi
oveku
Ali kako raunar razume instrukcije koje mu
zadajemo?

Raunari ne razumeju programe napisane u


programskim jezicima kao to su Pascal i Java
Programi se moraju prvo kompajlirati ili prevesti u
mainski kod koji raunar moe da izvrava
Program i postupak pomou koga se kod
programskog jezika prevodi u mainski kod naziva se
kompajler i kompajliranje
Razliite platforme, ili hardver sa operativnim
sistemom zahtevaju razliit mainski kod, programi
se moraju odvojeno kompajlirati za razliite
platforme

SI1P1 2004

5/15

Kompajliranje

SI1P1 2004

6/15

Java kompajliranje
Java kompajler stvara bytecode, a ne mainski kod
Bytecode se konvertuje u mainski kod pomou Java
interpretera
Tako se moe pokrenuti bytecode na bilo kom raunaru koji
ima instaliran Java interpreter

SI1P1 2004

7/15

SI1P1 2004

8/15

Pokretanje programa

Pokretanje programa

Ulazni podaci (inputs)


Mogu se dobiti iz mnogih izvora, kao to je korisnik, fajlovi, ili drugi programi
Mogu biti u razliitim formama, kao to je tekst, slika ili zvuk

Izlazni podaci (outputs)


Takoe mogu biti u razliitim formama, kao to su brojevi, slike, zvukovi, ili
komande drugim programima

SI1P1 2004

9/15

Izvravanje programa

SI1P1 2004

10/15

Primer

elite da napiete program koji sabira dva broja


ta predstavlja ulazne podatke za va program?
dva broja

ta va program radi?
sabira dva broja

ta je izlaz vaeg programa program?


zbir dva broja

SI1P1 2004

11/15

SI1P1 2004

12/15

Kompajliranje i izvravanje programa u Javi

Prednosti korienja Jave

Kada se jednom kompajlira Java program, tada se


bytecode moe izvravati na bilo kojoj maini koja
ima Java interpreter
Zato to se ne mora rekompajlirati prgram za svaku
mainu, Java je platformski neutralna
Java je bezbedna. Drugim reima, Java i kompajler
tite raunar od estih programerskih greaka i
opasnih operacija
Java standardizuje mnoge korisne operacije kao to
je upravljanje mrenim konekcijama i obezbeuje
grafiki korisniki interfejs

SI1P1 2004

13/15

SI1P1 2004

Mane korienja Jave

Primer

Izvravanje bytecode pomou interpretera je sporije


nego izvravanje mainskog koda, koji je specifian
za svaku posebnu platformu.
Korienje specifinih mogunosti pojedine
platforme (Windows taskbar) je teko pomou Java
jezika jer je platformski neutralan.
Da bi sse pokrenuo Java program na vie maina,
mora se instalirati Java interpreter na svakoj od njih

/* HelloWorld klasa prikazuje Hello,


World! na ekranu */
public class HelloWorld {
public static void main(String[] args) {
// Prikaz Hello, World!
System.out.println("Hello, World!");
}
}

SI1P1 2004

15/15

SI1P1 2004

14/15

16/15

Komentari

Pregled lekcije

Komentari se koriste da opiu napisani kod i da se bolje


razume smisao. Java kompajler ga ignorie.
Komentari se dobijaju korienjem
//, to definie komentar do kraja linije
/* */, to definie komentar za sve to se nalazi
izmeu, ukljuujui vie linija
Primeri dve vrste komentara:

ta je program
Kako napisati pravilno program za raunar
Prednosti i mane korienja Jave
Kako program napisan u Javi promeniti u formu koju
svaki raunar razume
Primer Java koda i komentari

/* HelloWorld klasa prikazuje Hello,


World! na ekranu */
// Prints Hello, World!
SI1P1 2004

17/15

18/15

SI1P1 2004

Uvod

ta su promenljive

Uvod u programiranje 1 Java


Promenljive i osnovni tipovi podataka

SI1P1 2004

19/15

Tipovi promenljivih
Imena promenljivih
Dodele vrednosti

Primitivni tipovi podataka


Ostali tipovi podataka (String)

SI1P1 2004

20/15

Promenljive

Promenljive

U matematikoj algebri, promenljive su simboli koji


predstavljaju odreene vrednosti u formulama

Na primer promenljiva x u sledeoj formuli


f(x)=x*2+2
Moe predstavljati bilo koju numeriku vrednost
Slino, promenljive u raunarskim programimasu
simboli koji predstavljaju odreene podatke

21/15

SI1P1 2004

Promenljive i Java

SI1P1 2004

Promenljive u Javi imaju svoj tip.


Tip promenljive definie koja vrsta vrednosti se
moe zapamtiti u okviru promenljive
Analogija sa kutijom tip promenljive je veliina ili
oblik prazne kutije
U formuli

Promenljiva x je broj.
Ako je x simbol koji predstavlja re Singidunum,
formula nema smisla.

SI1P1 2004

Pomeri KutijuX na policu A


Postavi predmet Z u KutijuX
Otvori KutijuX
Ukloni sadraj iy KutijeX

22/15

Tipovi promenljivih u Javi

f(x)=x*2+2

Promenljive se mogu predstaviti kao prazne kutije u


koje se mogu smestiti odreene vrednosti
Na kutiju se moe nalepiti nalepnica sa imenom, na
primer KutijaX i koristiti vie puta
Takoe mogu se obavljati odreene operacije, bez
obzira na sadraj same kutije:

23/15

Celobrojni tipovi:
int: veina brojeva se predstavlja pomou ovog
tipa
long: veliki brojevi, u oblasti istraivanja, finansija,
raunara.
short: mali brojevi, ne mnogo korisno.
byte: veoma mali brojevi
Floating Point (Decimalni) tipovi:
float: Single-precision decimalni brojevi
double: Double-precision decimalni brojevi
Ostali tipovi:
String: tekstualni tip.
boolean: tano ili netano (true ili false)
char: Alfanumeriki karakteri

SI1P1 2004

24/15

Deklaracija promenljivih u Javi

Dodela vrednosti promenljivih u Javi

Promenljive se kreiraju tako to se deklarie njihov


tip i ime na sledei nain:
tip ime;
Deklarisanje celobrojne promenljive sa imenom x:
int x;
Deklarisanje stringa sa imenom pozdrav:
String pozdrav;
U prethodnim primerima promenljive nisu dodeljene
vrednosti, ve su samo formirane prazne kutije

SI1P1 2004

25/15

Imenovanje promenljivih u Javi

Dodela vrednosti promenljivih se obavlja koristei sledeu


sintaksu:
ime = vrednost;
Na primer:
x = 100;
pozdrav=Zdravo;
Nelegalno je dodeliti promenljivoj vrednost pogrenog tipa:
x = Zdravo;
x = 1.2;
pozdrav = 123;
U okviru jednog koraka moe se promenljiva deklarisati i
dodeliti joj se vrednost
int x =100;
String pozdrav=Zdravo;

SI1P1 2004

26/15

Imenovanje promenljivih u Javi

Imena promenljivih (identifikatori) mogu biti


proizvoljne duine, ali moraju poeti sa:
slovo (a z),
znak dolar ($),
ili, donjom crtom ( _ ).
Imena promenljivih ne mogu sadravati specijalne
operacione simbole kao to su +, -, *, /, &, %, ^, ...
Korienje rezervisanih rei Jave je takoe
nelegalno.
Na primer class, static, int, ...

SI1P1 2004

27/15

Java je case-sensitive razlikuju se mala i velika


slova.
Bosko nije isto kao bosko, odnosno BOSKO.
Treba birati imena promenljivih koja su
informativna.
Dobar izbor: int studentIspitOcena;
Lo izbor: int tempvar3931;
Preporuka je da imena promenljivih poinju malim
slovom i da svaka re unutar imena poinje sa
velikim: studentIspitOcena.

SI1P1 2004

28/15

Imenovanje promenljivih u Javi

Celobrojni tip

Koja imena su validna?

1.$amount
2.6tally
3.my*Name
4.salary
5._score
6.first Name
7.total#
8.short

SI1P1 2004

29/15

String tip

SI1P1 2004

30/15

Racionalni tip

String nije primitivan tip podataka. Oni nasleuju


klasu Object, diskutovae se kasnije.
String je niz karaktera izmeu apostrofa i na
primerneki tekst.

Stringovi mogu koristiti specijalan operator + koji


kreira novi String:
String pozdrav= Zd+ ravo;
String josJedanPozdrav= pozdrav+ !;

SI1P1 2004

Postoje etiri osnovna celobrojna tipa podataka:


byte, short, int, long.
Svaki tip ima maksimalnu vrednost, baziranu na
njihovoj binarnoj reprezentaciji:
Bytes: 8-bits, 128
Short: 16-bits, 215 32,000
Int: 32-bits, 231 2 billion
Long: 32-bits, 263 veoma veliko
Integer Overflows: ta se deava ako se pokua
smestiti vea vrednost u tip podataka?

31/15

Inicijalizuju decimalnu vrednost broja:


double y = 1.23;
double w = -3.21e-10; // -3.21x10-10
Koristi se d da bi se vrednost prikazala kao
decimalna:
double y = 1d/3; // y = .333333333
double z = 1/3; // z = 0.0 Zato?
Float se moe definisati kao i double, ali treba
dodati i f:
float z = 1.23f;
Double je precizniji nego Floats, ali izvravanje
operacija due traje

SI1P1 2004

32/15

Logiki tip

Karakter

Boolean (logiki tip) je tip podataka koji se koristi u


situacijama kada postoje dve opcije tano ili
netano (true ili false).
Vrednosti true i false su case sensitive. Ne prihvata
se True ili TRUE.
Ovaj tip podataka se koristi za testiranje osobina
podataka i za kontrole toka
Primer:
boolean daLiCitati = true;
boolean fileOpen = false;

SI1P1 2004

33/15

Pitanja
Koje tipove podataka treba koristiti za sledee informacije?:
1. Broj stanovnika Srbije
2. Broj stanovnika na Zemlji
3. i
4. Status dokumenta (otvoren/zatvoren)
5. Ime
6. Prvo slovo imena
7. $ 237.66
int
long
double
boolean
String
char
SI1P1
2004
double

Karakter je tip podataka koji se koristi da bi se


predstavio pojedinaan karakter, kao to je slovo,
broj, odreeni znak ili neki drugi simbol.
Karakteri su pojedinani simboli smeteni izmeu
jednostrukih navodnika
Ne treba ih izjednaavati sa String-ovima.
Primer:
char prvoSlovoImena = 'e' ;
char pitanje = '?' ;

SI1P1 2004

34/15

Iskazi

35/15

Iskazi su komande koje dovode do odreenih


dogaaja
Svi iskazi moraju se zavravati sa ;
Deklarisanje promenljiv je jedan iskaz
Dodeljivanje vrednosti promenljivoj je jedan iskaz
Poziv metoda ili funkcije su iskazi:
System.out.println(Hello, World);
U narednim lekcijama emo uiti kako da se
kontrolie izvravanje iskaza

SI1P1 2004

36/15

Rezervisane rei

SI1P1 2004

Tipovi podataka

37/15

38/15

SI1P1 2004

Tipovi podataka

Uvod u programiranje 1 Java


Operatori

SI1P1 2004

39/15

SI1P1 2004

40/15

10

Uvod

ta su operatori

ta su operatori
Aritmetiki operatori, kao to su +, Operator dodele vrednosti
Inkrement/Dekrement operatori, ++
Relacionalni operatori
Kondicionalni operatori

41/15

SI1P1 2004

Grupe operatora

SI1P1 2004

Aritmetiki operatori,
Operator dodele vrednosti
Inkrement/Dekrement operatori
Relacionalni operatori
Kondicionalni operatori

U nastavku predavanja svaka grupa e se razmatrati


detaljno

SI1P1 2004

42/15

Aritmetiki operatori

Postoji 5 razliitih groupa operatora:

Operatori su specijalni simboli koji se koriste za:


-matematike funkcije
-iskaze dodele vrednosti
-logika uporeivanja
Primeri upotrebe operatora:
3+5
// korienje + operatora
14 + 5 4 * (5 3)
// korienje +, -, *
operatora
Izrazi su kombinacija promenljivih, konstanti i
operatora i definiu odreenu vrednost

43/15

Java ima 6 osnovnih aritmetikih operatora:


+ sabiranje
- oduzimanje
* mnoenje
/ deljenje
% modul (ostatka)
^ eksponent
Prioritet ili izvravanje operacija koje se nalaze u
okviru izraza moe se definisati u akronimu
PEMDAS.

SI1P1 2004

44/15

11

Proritet izvravanja operacija

Proritet izvravanja operacija

Proritet izvravanja operacija(PEMDAS)


1.Parentheses - zagrade
2.Exponents - eksponenti
3.Multiplication and Division from left to right
mnoenje i deljenje posmtrano sa leve strane ka
desnoj
4.Addition and Subtraction from left to right sabiranje i oduzimanje posmtrano sa leve strane ka
desnoj

SI1P1 2004

45/15

Primer: 10 + 15 / 5;
Rezultat se razlikuje u zavisnosti od toga da li se
prvo izvrava sabiranje ili deljenje
(10 + 15) / 5 = 5
10 + (15 / 5) = 13
Ako ne postoje zagrade Java e izvriti drugi sluaj
Trebalo bi koristiti uvek zagrade da bi se izbegla
konfuzija

SI1P1 2004

46/15

Celobrojno deljenje

Operator dodele vrednosti

U prethodnom primeru rezultat deljenja (10 + 15) / 5 je bio


celobrojan (5).
Ali ta se deava ako hocmo da izvrimo operaciju 63 / 35?
U zavisnosti od tipa podatka u kome su smeteni brojevi,
dobijamo razliite rezultate.
int i= 63;
int j= 35;
System.out.println(i/ j);
Izlaz: 1
double x= 63;
double y= 35;
System.out.println(x/ y);
Izlaz: 1.8
Rezultat celobrojnog deljenja je samo ceodeo dobijenog
rezultata!

Osnovni operator dodele (=) dodeljuje


vrednost ex promenljivoj var
var= expr;
Java dozvoljava da se kombinuju aritmetiki
i operator dodele u jedinstven operator
Primeri:
x= x+ 5; je isto to i x+= 5;
y= y* 7; je isto to i y*= 7;

SI1P1 2004

47/15

SI1P1 2004

48/15

12

Inkrement/dekrement

Inkrement/dekrement

++ se zove inkrement operator. Koristi se da bi se


poveala vrednost promenljive za 1.
Na primer:
i= i+ 1;
Moe se napisati i kao:
++i;
ili i++;
-- se zove dekrement operator. Koristi se da bi se
smanjila vrednost promenljive za 1.
i= i-1;
Moe se napisati i kao :
--i;
ili i--;

SI1P1 2004

49/15

Inkrement/dekrement

SI1P1 2004

50/15

Relacionalni operatori

Postfix forma i++, i -- prvo izvri ceo izraz, pa onda


povea/smanji vrednost promenljive
Primer:
int numOranges= 5;
int numApples= 10;
int numFruit;
numFruit= numOranges++ + numApples;
numFruit je dobio vrednost 15
numOranges je dobio vrednost 6

SI1P1 2004

Inkrement / dekrement operator ima dve forme :


-Prefix forma
++i; --i;
-Postfix forma
i++; i--;
Prefix forma prvo doda/oduzme 1 od promenljive i
tek onda nastavi sa ostalim operatorima u izrazu
Primer:
int numOranges= 5;
int numApples= 10;
int numFruit;
numFruit= ++numOranges+ numApples;
numFruit je dobio vrednost 16
numOranges je dobio vrednost 6

51/15

Relacionalni operatori uporeuju dve vrednosti


Dobijeni rezultat je logikog tipa (true ili false) u
zavisnosti od relacije operanada

SI1P1 2004

52/15

13

Primer relacionalnih operatora

Kondicionalni operatori

int x= 3;
int y= 5;
boolean result;
1) result= (x> y);
U ovom sluaju vrednost promenljive result je false
zato to 3 nije vee od 5
2) result= (15 == x*y);
U ovom sluaju vrednost promenljive result je true
zato to proizvod 3 i 5 jeste jednak 15
3) result= (x != x*y);
U ovom sluaju vrednost promenljive result je true
zato to proizvod 3 i 5 jeste razliit od 3

SI1P1 2004

53/15

Tabela istinitosti

Kondicional operatori se jo nazivaju i boolean


(logiki) operatori, jer koriste samo izraze koje
imaju vrednosti true ili false.

SI1P1 2004

54/15

Primer

boolean x= true;
boolean y= false;
boolean result;
1. result= (x&& y);
U ovom sluaju vrednost promenljive result je false
2. = ((x|| y) && x);

SI1P1 2004

55/15

(x|| y) je true
(true && x) je true
U ovom sluaju vrednost promenljive result je true

SI1P1 2004

56/15

14

Korienje && i ||

Korienje && i ||

Java izvrava skraeno izraunavanje: to znai da


pri izraunavanju && i || izraza sa leve ka desnoj
strani, im se pronae rezultat prestaje se sa daljim
izraunavanjem.
Primer:
(a && (b++ > 3))
(x || y)
Java e izraunati
a pre (b++ > 3)
x pre y

SI1P1 2004

57/15

Primer

(a && (b++ > 3));


ta se deava ako je a false?
Java nee ni izraunavati izraz (b++ > 3), ako je
levi operand false, jer je rezultat automatski false.
To dovodi do toga da se vrednost b nee
inkrementirati
(x || y);
ta se deava ako je x true?
Slino, nee se izraunati vrednost desnog
operanda, jer je rezultat sigurno true.

SI1P1 2004

58/15

Operatori

1) Kolika je vrednost promenljive number?


int number= 5 * 3 3 / 6 9 * 3;
2) Kolika je vrednost promenljive result?
int x= 8;
int y= 2;
boolean result= (15 == x * y);
3) Kolika je vrednost promenljive result?
boolean x= 7;
boolean result = (x< 8) && (x> 4);
4) Kolika je vrednost promenljive numCars?
int numBlueCars= 5;
int numGreenCars= 10;
intnumCars= numGreenCars+++ numBlueCars+ ++numGreeenCars;
SI1P1 2004

59/15

Sve o Java operatorima

http://java.sun.com/docs/books/tutorial/java/nutsandbolts/
opsummary.html

SI1P1 2004

60/15

15

Izrazi

Rezervisane rei

Izrazi su komande koje dovode do odreenih


dogaaja
Svi izrazi moraju se zavravati sa ;
Deklarisanje promenljiv je jedan izraz
Dodeljivanje vrednosti promenljivoj je jedan izraz
Poziv metoda ili funkcije su izrazi:
System.out.println(Hello, World);
U narednim lekcijama emo uiti kako da se
kontrolie izvravanje izraza

SI1P1 2004

61/15

Tipovi podataka

SI1P1 2004

SI1P1 2004

62/15

Tipovi podataka

63/15

SI1P1 2004

64/15

16

Uvod

Uvod u programiranje 1 Java


Kontrole toka

SI1P1 2004

65/15

ta su kontrolne strukture

SI1P1 2004

66/15

if struktura

Bez kontrolnih struktura, raunar bi izvravao


instrukcije iz programa korak-po-korak
Kontrolne strukture omoguavaju promenu:
redosled po kome e se instrukcije izvravati
koje instrukcije e se izvravati
kontrola toka samog programa
Kontrolne strukture ukljuuju:
blokovske izraze (sve to se nalazi unutar
velikih zagrada)
izraze odluivanja
petlje

SI1P1 2004

ta su kontrolne strukture
Tipovi kontrolnih struktura:
Blok
Izrazi odluivanja
Petlje

67/15

if klauzula doprinosi uslovnom izvravanju


programa
if (expression) {
statement;
}
next_statement;
Izraz expression mora biti logikog tipa i njegova
vrednost mora biti true ili false
Ako je vrednost izraza expression true, izvravaju
se izrazi statement, pa nakon njih next_statement
Ako je vrednost izraza expression false, izrazi
statement se nee izvriti i program e nastaviti sa
izvravanjem next_statement

SI1P1 2004

68/15

17

if struktura

if-else struktura
Osnovna if struktura se moe proiriti dodavanjem else
uslova, da bi se definisalo ta se deava ukoliko uslov nije
ispunjen
if (expression) {
statement1;
}
else{
statement2;
}
next_statement;
Ponovo izraz expression mora biti logikog tipa i njegova
vrednost mora biti true ili false
Ako je vrednost izraza expression true, izvravaju se izrazi
statement1, pa nakon njih next_statement.
Ako je vrednost izraza expression false, izvravaju se izrazi
SI1P1 2004
statement2, pa nakon njih next_statement.

SI1P1 2004

69/15

if-else struktura

70/15

Ugnjeeni if-else

Mogue je kombinovati vie if-else izraza jedan


unutar drugog i nataj nain dobiti viestruke upite
if (grade == 'A')
System.out.println(Pera je dobio A.");
else if (grade == 'B')
System.out.println("Pera je dobio B.");
else if (grade == 'C')
System.out.println("Pera je dobio C.");
else
System.out.println("Pera je dobio F.");

SI1P1 2004

71/15

SI1P1 2004

72/15

18

switch struktura

switch struktura

switch struktura je drugi nain da se testira vie vrednosti


jednog izraza
Vrednost izraza expression mora biti tipa char,byte,short ili
int, ali ne moe biti long,float, String ili double.
switch (expression) {
case value1:
statement1;
case value2:
statement2;
default:
default_statement;
}
Napomena: Svaki izraz nakon true sluaja e se izvriti

SI1P1 2004

73/15

switch struktura

SI1P1 2004

74/15

switch struktura

break; izraz definie raunaru izlazak iz switch strukture


switch (expression) {
case value1:
statement1;
break;
case value2:
statement2;
break;
default:
default_statement;
break;
}

SI1P1 2004

75/15

SI1P1 2004

76/15

19

switch struktura

Petlje

SI1P1 2004

77/15

Petlje dozvoljavaju izvravanje izraza ili bloka vie


izraza nekoliko puta
Postoje tri tipa petlji u Javi:
for petlje
while petlje
do-while petlje (nee se razmatrati u okviru ovog
kursa)

SI1P1 2004

78/15

for petlja

for petlja

for (inicijalizacija; uslov; inkrement){


//izrazi
}
Kontrola for petlje je definisana u okviru prve
zagrade i sastoji se iz tri dela
1.Prvi deo, inicijalizacija, postavlja poetne uslove
petlje i izvrava se pre samog starta petlje
2. Petlja se izvrava sve dok je uslov true i ponavlja se
izvravanje izraza
3. Trei deo kontrolnih informacija je inkrement,koji se
koristi za promenu brojaa petlje. Ovaj postupak se
izvrava na kraju svake iteracije petlje.

SI1P1 2004

79/15

SI1P1 2004

80/15

20

for petlja

for petlja

for(int div = 0; div<1000; div++) {


if(div% 12 == 0){
System.out.println(div+je deljivo sa 12");
}
}
U okviru izvravanja ovog primera e se prikazati
svaki broj od 0 do 999 koji je deljiv sa 12.

SI1P1 2004

81/15

while petlja

Ako se u uslovu inicijalizacije i inkrementa


pojavljuje vie od jedne promenljive, tada su ove
promenljive odvojene zarezom.
for (i=0,j=0; i*j<1000; i++,j+=2) {
System.out.println(i+"*"+j+"="+i*j);
}
Ne mora se popuniti svaki deo kontrole petlje, ali
mora postojati dva puta simbol ;
for (int i=0; i<100; ) {
sum+=i;
i++;
}

SI1P1 2004

82/15

while petlja

while (expression){
statement
}

while petlja se izvrava sve dok logiki izraz


expression ima vrednost true. Kada expression
postane false, izvravanje se nastavlja sa prvom
instrukcijom iza petlje
Izraz se proverava na poetku petlje, pa ako
inicijalno ima vrednost false, telo petlja se nee
izvriti nijednom.

SI1P1 2004

83/15

SI1P1 2004

84/15

21

while petlja

Korienje break naredbe

U prethodnim primerima je naredba break koriena u okviru


switch strukture.
U petljama,ova naredba se moe koristiti da bi se izalo iz
trenutne petlje
int index = 0;
while (index <= 10){
index++;
if (index==3)
break;
System.out.println(Indeks je + index);
}

Indeks je 1
Indeks je 2
SI1P1 2004

85/15

Petlja unuta petlje

SI1P1 2004

Pitanja 1

Mogue je unutar bilo koje vrste petlje ubaciti bilo


koju vrstu petlje

SI1P1 2004

86/15

87/15

U okviru programa realizuje se i opcija za podizanje


para sa rauna. Kako treba koristiti if strukturu da
bi se korektno izvrila data opcija.
If struktura se koristi da bi se proverilo da li je iznos
koji se podie manji ili jednak trenutnom iznosu u
banci.

SI1P1 2004

88/15

22

Pitanja 2

Pitanja 3

Kako se moe implementirati funkcija


AbsoluteValue, funkcija koja kao rezultat vraa
pozitivnu vrednost unetog broja
Bolje je koristiti if strukturu nego switch.

for (int i=100; i>=0; i--) {


System.out.println(i);
}

SI1P1 2004

ta je rezultat izvravanja sledee petlje?

89/15

Brojevi od 100 do 0.

SI1P1 2004

90/15

ta su nizovi

Uvod u programiranje 1 Java


Nizovi na
nain organizovanja podataka

SI1P1 2004

91/15

Niz je serija odeljaka koji slue za smetanje


podataka.
To je u stvari blok promenljivih.
U Javi, nizovi mogu da obuhvate samo jedan tip
podataka.
Na primer niz moe obuhvatiti samo lanove koji su
celobrojni borjevi ili samo lanove koji su stringovi

SI1P1 2004

92/15

23

Nizovi

Nizove definie tip, ime i veliina.


Niz od tri celobrojne veliine koji se zove prices:

Niz od tri string veliine koji se zove people

Deklarisanje nizova

Pojedinana vrednost u okviru niza je element niza.


Pozicija svakog elementa u okviru niza je njegov
indeks.

SI1P1 2004

93/15

Rezervisanje prostora

int prices[];
SI1P1 2004

94/15

Indeksi

Za razliku od obinih promenljivih pri korienju


nizova, potrebno je rezervisati eljenimemorijski
prostor. (U jeziku C postoji naredba malloc())
Koristi se kljuna re new da bi se rezervisala
memorija:
imeNiza = new tipPodataka[veliina];

prices = new int[3];


people = new String[4];
Prvi primer rezervie prostor za niz celih brojeva
veliine 20, a drugi primer niz Stringova veliine 10.
Moe se kombinovati deklaracija sa rezervisanjem
int[] prices=new int[3];

SI1P1 2004

int[] prices;
String[] people;
Na drugi nain deklarisanje je mogue:
tipPodataka imeNiza[];

Deklaracija nizova je slina deklaraciji obinih


promenljivih, samo to se koriste srednje zagrade [
].
tipPodataka[] imeNiza;

95/15

Pojedinanom elementu niza se pristupa pomou


njegovog indeksa.
U Javi indeksi kreu od broja 0 i poslednji ima
indeks n-1, gde je n veliina niza.
Na primer niz prices ima veliinu 3, i njegovi
elementi imaju indekse 0, 1, i 2.
uvati se Array out of Bounds greaka.
imeNiza[indeks]
Sa elementima niza se moe postpuati kao sa
obinim promenljivima
prices[0] = 6;
prices[1] = 80;
prices[2] = 10;

SI1P1 2004

96/15

24

Korienje nizova

Inicijalizacija nizova

Elementima niza Stringova se pristupa na identian


nain:

String[] people;
people = new String[4];
people[0] = Lana;
people[1] = Pera;
people[2] = Mika;
people[3] = Maja;

SI1P1 2004

97/15

Korieni pojmovi

String[] people= {Lana,Pera, Mika, Maja};


int[] prices = {6, 80, 10};
Svi elemnti niza i ovom sluaju moraju biti istog
tipa.

SI1P1 2004

98/15

Pitanja

Rezervisanje prostora kreiranje prznaog


memorijskog prostora, u koji e se smestiti niz.
Inicializacija Popunjavanje rezervisanog prostora
za niz sa inicijalnim vrednostima.
Element pojedinani lan niza.
Indeks pozicija elementa u okviru niza.
Veliina ili duina niza - Broj elemenata niza.

SI1P1 2004

Mogu se definisati i svi elementi niza, pri njegovom


deklarisanju.
Tada se koristi velika zagrada da bi se odvojili
elementi niza od ostatka koda i zarez da bi se
odvojili pojedinani elementi.

99/15

Koje od sledeih naredbi ne kreiraju niz

SI1P1 2004

100/15

25

Duina niza

Primer

Svaki niz ima svoju osobinu kojoj se moe pristupiti


po imenu length
Pristup ovoj osobini se odvija na sledei nain:
imeNiza.length;
String[] people = {Lana,Pera, Mika, Maja};
int numPeople = people.length;
Vrednost promenljive numPeople je 4.
Nizovi su uvek iste duine. Njihova duina se ne
moe menjati od trenutka kada su kreirani.

SI1P1 2004

101/15

Primer 2

Primer koda:
String[] names = {Lana,Pera, Mika, Maja};
for(int i=0; i<names.length; i++)
System.out.println(names[i]+!");

Rezultat:
Lana!
Pera!
Mika!
Maja!

SI1P1 2004

102/15

Primer 3

Koji je sadraj niza c nakon izvravanja datog


programskog segmenta?
int [] a = {1, 2, 3, 4, 5};
int [] b = {11, 12, 13};
int [] c = new int[4];
for (int j = 0; j < 3; j++) {
c[j] = a[j] + b[j];
}

SI1P1 2004

103/15

SI1P1 2004

104/15

26

Primer sortiranja 1

Primer sortiranja 2

public class BubbleSort {


public static void main(String[] args) {
int[] test = {52,654,15,994,2,35,12,5,7,9};
for (int j = 1; j < test.length; j++) {
for (int i = 1; i < test.length; i++) {
if (test[i - 1] > test[i]) {
final int tmp = test[i - 1];
test[i - 1] = test[i];
test[i] = tmp;
}
}
}
for (int i=0; i<test.length; i++) {
System.out.println(test[i]);
}
}
}
SI1P1 2004

105/15

Dvodimenzionalni nizovi

public class BubbleSort {


public static void main(String[] args) {
int[] test = {52,654,15,994,2,35,12,5,7,9};
boolean sortirano = false;
while (!sortirano){
sortirano = true;
for (int i = 1; i < test.length; i++) {
if (test[i - 1] > test[i]) {
final int tmp = test[i - 1];
test[i - 1] = test[i];
test[i] = tmp;
sortirano = false;
}
}
}
for (int i=0; i<test.length; i++) {
System.out.println(test[i]);
}
}
SI1P1
} 2004

Dvodimenzionalni nizovi

Nizovi koji su do sada razmatrani mogu se


posmatrati kao jedan red vrednosti
Dvodimenzionalni niz se moe posmatrati kao
mrea (ili matrica) vrednosti.
Svakom elementu dvodimenzionalnog niza se moe
pristupiti pomou dva indeksa: redni broj reda i
redni broj kolone.
Dvodimenzionalni niz je u sutini niz iji je svaki
element novi niz

SI1P1 2004

106/15

107/15

Primer: Karta zemljita je podeljena na mreu 20 x


55 razliitih imanja. U svakom polju treba upisati
povrinu odreenog imanja.
Prvo je potrebno deklarisati dvodimenzionalni niz:
double[][] heights;
heights= new double[20][55];
Ovaj dvodimenzionalni niz ima 20 redova i 55
kolona
Da bi se pristupilo pojedinanom imanju koje se
nalazi u 11-om redu i 23-oj koloni:
heights[11][23]

SI1P1 2004

108/15

27

Viedimenzionalni nizovi

Podnizovi mogu biti razliitih duina:


int[][] a = new int[3][];
int[] b = {1,2,3};
int[] c = {4,5,6,7};
int[] d = {8};
a[0]= b; a[1] = c; a[2] = d;

Uvod u programiranje 1 Java


Metodi

Mogu se definisati i viedimenzionalni nizovi:


int[][][][] a; // 4-D niz

SI1P1 2004

109/15

Sadraj lekcije

110/15

Koncept metoda

ta je metod
Zato koristimo metode
Kako da deklariemo metode
etiri dela metoda
Kako pozvati metod
Svrha metoda main
Neki primeri metoda

SI1P1 2004

SI1P1 2004

111/15

Metodi se jo nazivaju i funkcije ili procedure.


Metod je nain da se odreeni broj koraka integrie
u poseban deo koda i na taj nain posebno poziva i
obrauje.
Kada bi sve mogli da se koriste metodi?
izraunavanje kvadratne formule, prikaz na
ekranu, ...

SI1P1 2004

112/15

28

Koncept metoda

Izraunavanje kvadratnog korena

Metodi mogu da prihvate ulazne podatke u formi

Nakon toga mogu da izvre odreene operacije sa


argumentima
Na kraju mogu da vrate vrednost koju su dobili kao
rezultat izraunavanja, t.j. da generiu izlaz

argumenata

SI1P1 2004

113/15

Izraunavanje kvadratnog korena

Kvadratni koren je dobar primer upotrebe metoda.


Metod koji slui za dobijanje kvadratnog korena
prihvata broj kao argument i kao rezultat vraa
kvadratni koren od tog broja.

SI1P1 2004

114/15

Deklarisanje metoda

Izraunavanje kvadratnog korena obuhvata i vie


meukoraka izmeu operacija prihvatanja ulaznog
podatka i generisanja izlaza.
Kada se koristi ovaj metod, korisnika ne interesuju
pojedinani koraci. Jedino to mu je potrebno je da
se dobije korektan rezultat.
Skrivanje internog rada metoda od korisnika, ali
obezbeivanje korektnog rezultata se naziva jo i

Metod ima 4 dela: tip rezultata, ime, argumente, i


telo metoda
Tip, ime i argumenti, zajedno, se jo nazivaju i
potpis metoda

apstrakcija

SI1P1 2004

115/15

SI1P1 2004

116/15

29

Tip rezultata metoda

Generisanje rezultata

Tip rezultata metoda moe biti bilo kog tipa


podataka.
Tip metoda se odreuje na osnovu tipa podataka
koji se generie kao izlaz.
Metod moe i da ne vraa rezultat, u kom sluaju se
deklarie kao tipa void.

SI1P1 2004

117/15

Generisanje rezultata

U okviru metoda se koristi naredba return da bi se


definisao rezultat izvravanja operacije metoda.
Njegova forma je:
return vrednost_izvravanja;
Tip promenljive vrednost_izvravanja mora da
bude istog tipa kao i tip samog metoda:
double sqrt(int num) {
double answer;
// Izrauna se vrednost kvadratnog korena num
// i rezultat smesti u promenljivu answer
return answer;
}

SI1P1 2004

118/15

void metod

Metod se zavrava odmah nakon izvravanja


naredbe return
Zato je u veini sluajeva return naredba poslednja
naredba u okviru metoda
Metod moe imati i vie return naredbi.

int absoluteValue(int num){


if (num < 0)
return num;
else
return num;
}
SI1P1 2004

119/15

Metod tipa void ima return naredbu bez definisane


specifine vrednosti
return;
Na prvi pogled se ini da je ovaj pristup beskoristan,
ali se u praksi void esto koristi.
Dobar primer je metod kada je potrebno samo neto
prikazati na ekranu.
Kao se u okviru metoda tipa void ne navede naredba
return, podrazumeva se da se ona izvrava na kraju
metoda

SI1P1 2004

120/15

30

Argumenti metoda

Argumenti metoda

Metodi mogu dobijati ulazne podatke u formi


argumenata.
Argumenti se koriste kao promenljive u okviru tela
metoda.
Kao promenljive, i argumentima se mora
specificirati tip.
Argumenti se definiu unutar zagrada koje se nalaze
iza imena metoda.

double podeli(double a, double b) {


double odgovor;
odgovor = a / b;
return odgovor;
}

SI1P1 2004

121/15

Poziv metoda

pow(2, 10); //rauna 2 na 10

SI1P1 2004

SI1P1 2004

122/15

main metod

Da bi se pozvao odreeni metod, potrebno je


specificirati ime metoda, iza koga treba navesti listu
argumenata odvojenih zarezom i u okviru zagrada

Ako metod nema argumenata, treba navesti ime


metoda sa praznim zagradama:
size();
Neki metodi mogu sadrati re static pre tipa
metoda:
static double divide(double a, double b) {
return a / b;
}

Vie argumenata metoda se odvajaju zarezom:


double pow(double x, double y)
Argumenti mogu biti razliitog tipa
int indexOf(String str, int fromIndex)
Telo metoda je blok specificiran sa velikim
zagradama, { }. U okviru tela metoda se definiu
akcije metoda.
Argumenti metoda se mogu koristiti bilo gde u
okviru metoda.
Svi metodi moraju imati velike zagrade bez obzira
da li se telo metoda sastoji od jedne naredbe ili ak
od nijedne.

123/15

Do sada smo koristili jedino metod main


Ovaj metod je taka odakle uvek poinje
izvravanje Java programa
main metod je static i ima strog format koji se mora
potovati:
public static void main(String[] args) {
...
}

SI1P1 2004

124/15

31

main metod

Primer

class SayHi{
public static void main(String[] args) {
System.out.println("Hi, " + args[0]);
}
}
Ako se otkuca java Program arg1 arg2 argN u
okviru komandne linije, sve nakon imena klase se
automatski uitava u niz pod imenom args:
java SayHi Bosko
U ovom primeru lan args[0] e sadravati String
Bosko", i izlaz proma e biti "Hi, Bosko"
SI1P1 2004

static double addSometimes(num1, num2){


double sum;
if (num1 < num2){
sum = num1 + num2;
String completed = completed;
return completed;
}
}
125/15

Primer

SI1P1 2004

126/15

Primer

class Greetings {
public static void main(String args[]) {
String greeting = "";
for (int i=0; i < args.length; i++) {
greeting += "Jambo " + args[i] + "! ";
}
System.out.println(greeting);
}
}
Nakon kompaliranja i pokretanja
java Greetings Lana Pera Maja
izlaz e biti "Jambo Lana! Jambo Pera! Jambo
Maja!"

SI1P1 2004

ta nije u redu u sledeem delu programa

127/15

class Max {
public static void main(String args[]) {
if (args.length == 0) return;
int max = Integer.parseInt(args[0]);
for (int i=1; i < args.length; i++) {
if (Integer.parseInt(args[i]) > max) {
max = Integer.parseInt(args[i]);
}
}
System.out.println(max);
}
}
java Max 3 2 9 2 4 dobija se izlaz 9

SI1P1 2004

128/15

32

Najvaniji pojmovi

Metod je odvojeni deo koda koji moemo pozivati i


izvravati vie puta, a napisan je samo jednom
Metodi u Javi imaju 4 dela: tip podatka koji vraaju,
ime, argumente, telo.
Tip podatka koji se vraa i argumenti mogu biti
primitivni tip podataka (na primer int) ili sloeni (na
primer Object)
main je specijalni Java metod koji Java interpreter
trai kada eli da pokrene class fajl
main ima strog format:
public static void main(String args[])

SI1P1 2004

129/15

Do sada smo nauili

SI1P1 2004

130/15

ta moe biti problem

Tipove podataka: int, double, boolean, String


Promenljive: Pamte vrednost odreenog tipa.
Nizovi: Pamte vie vrednost odreenog tipa.
Kontrolne strukture: If-then, For petlje ...
Metodi: Delovi koda kojima moemo proslediti
argumente i izvriti ih.
Da li je to sve to nam je potrebno?

SI1P1 2004

Uvod u programiranje 1 Java


Objekti i klase

131/15

Neki podaci se pamte zajedno.


String[] imena
int[] ocene
Metodi poinju da se komplikuju.
Metodi mogu vratiti rezultat samo jednog tipa.
Programeri ne ele da razmiljaju o svim
neprikazanim tipovima.

SI1P1 2004

132/15

33

Apstrakcija

ta je objekat

Objekti su alati za primenu apstrakcije.


Pokuavamo apstraktovati odreene detalje da bi se
suoili sa kompleksnim problemima.
Apstrakcija je fundamentalni koncept u raunarskim
naukama.
Problem je i da se ne primenjuje suvie apstrakcije.
Umee je znati oje detalje treba sakriti, a koje treba
prikazati.

SI1P1 2004

133/15

ta je objekat

SI1P1 2004

134/15

Zato koristiti objekte

SI1P1 2004

Objekat ima dva dela:


Stanje: Osobine objekta.
Ponaanje: Stvari koje objekat moe da uradi.
Primer automobila:
Stanje: Boja, vrsta motora, automatik
Ponaanje: koiti, ubrzati, svirati, voziti u
odreenom smeru
Primer oovek:
Stanje: Teina, visina, pol, godite
Ponaanje: Jesti, spavati, vebati, uiti

135/15

Modularnost: Jednom kada se objekat definie,


moe se koristiti u proizvoljnom broju aplikacija.
Sakrivanje informacija: programere ne zanima kako
objekat funkcionie, ve samo njegov interfejs.
Primer:
Razliiti automobili mogu koristiti iste delove.
Ne zanima vas kako motor funkcionie, sve dok
moete da vozite automobil.

SI1P1 2004

136/15

34

Klase

Klase

Klasa je uzorak ili kalup pomou koga se stvara


objekat
Svaka klasa moe sadrati:
- lanove podataka (osobine/karakteristike
objekta/klase)
- Metode (definiu ponaanje objekata dobijenoh od
klase)
- Konstruktore (specijalne metode)

SI1P1 2004

137/15

Prva klasa: prekidacZaSvetlo

Osnovna anatomija klase


public class imeKlase{
lanove podataka
Konstruktori
Metodi
}

SI1P1 2004

138/15

Klase

class prekidacZaSvetlo{
boolean upaljeno = true;
}
Re class govori okruenju da elimo da definiemo
novi tip Object-a.
Klase su definicije stanja i ponaanja.
Objekti su instance klasa.
Sve u okviru Jave je objekat i ima svoju klasu.

SI1P1 2004

139/15

SI1P1 2004

140/15

35

Prva klasa: prekidacZaSvetlo

Definisanje ponaanja

class prekidacZaSvetlo{
boolean upaljeno = true;
}
Koje stanje prekidacZaSvetlo moe imati?
Stanje se pamti u okviru polja, ovde je to upaljeno
Poljima se prilazi na sledei nain:
imePromenljive.imePolja
Kasnije e biti rei o drugim vrstama polja
Koje ponaanje prekidacZaSvetlo moe imati?

SI1P1 2004

141/15

Korienje objekata

SI1P1 2004

142/15

Konstruktori

Konstruktori povezuju objekte sa podacima koji su


im potrebni da bi se inicijalizovali
Objekti imaju default konstruktor koji nema nijedan
argument, kao prekidacZaSvetlo().
Mogu se definisati sopstveni konstruktori koji mogu
imati proizvoljan broj argumenata.
Konstruktori nemaju tip povratka i moraju imati isto
ime kao klasa:
ImeKlase(definisanje argumenata) {
telo konstruktora
}

public static void main(String[] args) {


prekidacZaSvetlo s = new prekidacZaSvetlo();
System.out.println(s.upaljeno);
s.pritisni();
System.out.println(s.upaljeno);
}
Pomou new se kreira novi objekat.
Iza new mora se navesti konstruktor.
Metodi se pozivaju na sledei nain:
imePromenljive.imeMetoda(argumenti)
ta se dobija kao izlaz ovog programa?

SI1P1 2004

class prekidacZaSvetlo{
boolean upaljeno = true;
void pritisni() {
this.upaljeno = !this.upaljeno ;
}
}
Re this se odnosi na pojedinani objekat
Pomou this.upaljeno se pristupa polju upaljeno.
Koje ponaanje prekidacZaSvetlo sada moe imati?

143/15

SI1P1 2004

144/15

36

Konstruktori

Konstruktori

class prekidacZaSvetlo {
boolean upaljeno ;
void pritisni() {
this.upaljeno = !this.upaljeno ;
}
prekidacZaSvetlo (boolean pocetnoStanje) {
this.upaljeno = pocetnoStanje;
}
}
Konstruktor prekidacZaSvetlo() vie ne postoji.
Kako se sada pravi instanca objekta?

prekidacZaSvetlo() {
prekidacZaSvetlo(true) ;
}
prekidacZaSvetlo (boolean pocetnoStanje) {
this.upaljeno = pocetnoStanje;
}

145/15

SI1P1 2004

prekidacZaSvetlo

SI1P1 2004

146/15

prekidacZaSvetlo - druga verzija

class prekidacZaSvetlo{
boolean upaljeno = true;
boolean daLiJeUpaljeno() {
return upaljeno;
}
void pritisni() {
upaljeno = !upaljeno;
}
}

SI1P1 2004

}
Moe se definisati vie konstruktora.
Konstruktori se mogu meusobno pozivati.

class prekidacZaSvetlo{
int upaljeno = 1;
boolean daLiJeUpaljeno() {
return upaljeno == 1;
}
void pritisni() {
upaljeno = 1 - upaljeno;
}
}

147/15

SI1P1 2004

148/15

37

Apstrakcija

Problem apstrakcije

Obe prethodne verzije se imaju isto ponaanje.


Klasu prekidacZaSvetlo treba tretirati kao
apstrakciju: ne interesuje nas unutranjikod, ve
samo njeno ponaanje
Interni kod = implementacija
Spoljanje ponaanje = interfejs
Pisanje koda i poboljanje implementacije se moe
ovbavljati sve dok je interfejs isti
Sve dok je korisnjenje objekta date klase isto, ne
zanima nas kako je dobijeno dato ponaanje.
U velikim projektima, gde ima vie timova,
programera jedino zanima njegov deo koda (na
primer Microsoft, Google, Goldman Sachs, Morgan
Stanley i finansijske kompanije)

SI1P1 2004

149/15

Ako se polja ili metodi oznae kao private, tada im


druge klase ne mogu pristupiti
Ako se polja ili metodi oznae kao public, tada im
bilo koja druga klasa moe pristupiti
Ako se ne specificira posebno da li je polje ili metod
public ili private, tada se podrazumeva da je public.

SI1P1 2004

Korisnik klase prekidacZaSvetlo koji pristupa


logikoj promenljivoj upaljeno, grei ako se ova
promenljiva promeni u celobrojnu
class PrimerGreske{
public static void main(String[] args) {
prekidacZaSvetlo ls= new prekidacZaSvetlo ();
if (ls.upaljeno) // greska!
System.out.println("upaljeno!");
else
System.out.println(Nije upaljeno!");
}
}

SI1P1 2004

150/15

Poboljana verzija klase prekidacZaSvetlo

public i private pristupi

151/15

class prekidacZaSvetlo{
private boolean upaljeno = true;
public boolean daLiJeUpaljeno() {
return upaljeno;
}
void pritisni() {
upaljeno = !upaljeno;
}
}

SI1P1 2004

152/15

38

Novi problemi

Promenljive i objekti

U prethodnom primeru polje upaljeno je definisano


kao private
class prekidacZaSvetlo{
private boolean upaljeno = true;

Ako se iz druge klase pristupa ovom polju desie se


greka pri kompajliranju

Postoje dve vrste podataka u Javi: promenljive i


objekti
Promenljive: byte, short, int, long, double, float,
boolean, char
== proverava da li dve promenljive imaju istu
vrednost
Objekti: definisani u okviru Java klasa
== proverava da li su dva objekta isti objekat

if (ls.upaljeno) // greska

SI1P1 2004

153/15

Reference

154/15

SI1P1 2004

Reference

Pomou new se uvek stvara nova jedinstvena


instanca klase
Kada se instanca povee sa odreenom
promenljivom, tada promenljiva sadri referencu ili
vezu sa datim objektom
Covek g = new Covek(Lana", 3);
Covek h = new Covek(Lana", 3);
U ovom primeru g i h predstavljaju reference na dva
razliita objekta koji u ovom trenutku imaju
identina stanja

g != h se dobija, jer g i h predstavljaju reference na


razliite objekte
Covek g = new Covek(Lana", 3);
Covek h = new Covek(Lana", 3);

Lana
3
SI1P1 2004

155/15

SI1P1 2004

Lana
3
156/15

39

Reference

Pitanja

maja1 == maja2 se dobija, jer maja1 i maja2


predstavljaju referencu na isti objekat
Covek maja1 = new Covek(Maja", 34);
Covek maja1 = maja2;

maja1

maja2

Da li je (a == b)?
int a = 7;
int b = 7;
Odgovor: Da
Da li je (g == h)?
Person g = new Person(Mwangi", 21);
Person h = new Person(Mwangi", 21);
Odgovor: Ne

Maja
34
SI1P1 2004

157/15

Pitanja

158/15

Primer BankAccount

true ili false?


Person g = new Person(James", 22);
Person h = new Person("James", 22);
Person lucy1 = new Person(Lucy", 19);
Person lucy2 = lucy1;
a) g == h
b) g.getAge() == h.getAge()
c) lucy1 == lucy2
d) lucy1.getAge() == lucy2.getAge();

SI1P1 2004

SI1P1 2004

159/15

class BankAccount{
double balance;
String name;
BankAccount(String name, doubleopenBalance){
this.name = name;
this.balance = openBalance;
}
double deposit(double amount) {
balance += amount;
return balance;
}
boolean withdraw(double amount) {
if (amount < balance){
balance -= amount;
return true;
} else return false;
}
SI1P1
} 2004

160/15

40

Java API

Sve informacije o ugraenim Java klasama i


njihovim metodama se mogu dobiti pomou
Java Application Programming Interface
(API)
Ova dokumentacija je osnov za realizaciju
bilo koje sloene Java aplikacije

SI1P1 2004

161/15

Uvod u programiranje 1 Java


Static & Final

SI1P1 2004

Primer

Analiza

public class MyMath{


public double PI = 3.14159;
public double square (double x) {
return x * x;
}
public static void main(String[ ] args) {
MyMath m = new MyMath();
System.out.println("m: value of PI is " + m.PI);
System.out.println("m: square of 5 is " + m.square(5));
MyMath n = new MyMath();
System.out.println("n: value of PI is " + n.PI);
System.out.println("n: square of 5 is " + n.square(5));
}
}

SI1P1 2004

163/15

162/15

U prethodnom primeru, da bi se dobio kvadrat broja


5 potrebno je kreirati instancu klase MyMath:
MyMath m = new MyMath();
Tada se poziva metod square() sa argumentom 5:
m.square(5);
Rezultat poziva metoda square() sa instancama m i
n je isti:
m: value of PI is 3.14159
m: square of 5 is 25
n: value of PI is 3.14159
n: square of 5 is 25
Metod square() se ponaa isto bez obzira koja ga
instanca poziva

SI1P1 2004

164/15

41

Analiza

MyMath - ponovo

Vrednost promenljive PI = 3.14159 je ista za sve


instance klase MyMath.
Zato je potrebno smestiti vrednost PI nezavisno za
svaku instancu klase MyMath?
Da li je mogue smestiti jednu vrednost promenljive
PI za celu klasu MyMath?

SI1P1 2004

165/15

static PI

public class MyMath{


// add keyword "static" to field declaration
public static double PI = 3.14159;
// add keyword "static" to method declaration
public static double square (double x) {
return x * x;
}
// main method is always declared "static"
public static void main( String[ ] args) {
// MyMath m = new MyMath();
// MyMath n = new MyMath(); -No longer need this line!
// Now invoke square() method on the MyMathclass
System.out.println("Valueof PI is " + MyMath.PI);
System.out.println("Squareof 5 is" + MyMath.square(5));
}
}
166/15
SI1P1 2004

final

U prethodnom primeru je dodata re static kod


deklaracije konstante PI:
public staticdouble PI = 3.14159;
Na taj nain je definisano da postoji samojedna
vrednost promenljive PI za sve instance klase
MyMathclass
PI je sada podatak koji pripada klasi

SI1P1 2004

167/15

Promenljiva PI je deklarisana sa
public static double PI = 3.14159;
I na ovaj nain je mogue promeniti njenu
vrednost:
MyMath.PI= 999999999;
Da bi se definisala kao konstanta potrebno je
koristiti re final:
public static final double PI = 3.14159;
Kada se jednom promenljiva deklarie kao final,
njena vrednost se ne moe menjati!

SI1P1 2004

168/15

42

MyMath nova verzija

final

SI1P1 2004

169/15

static metod

public class MyMath{


// add keyword finalto field declaration
public static finaldouble PI = 3.14159;
public static double square (double x) {
return x * x;
}
public static void main( String[ ] args) {
System.out.println("Valueof PI is " +
MyMath.PI);
System.out.println("Squareof 5: " +
MyMath.square(5));
}
}

Jo jedan primer upotrebe final


public static final Point ORIGIN =new Point(0,0);
Time smo zabranili promenu vrednosti promenljive
na sledei nain:
MyMath.ORIGIN= new Point(3, 4);
ALI! I dalje se mogu pozivati metodi koji na nenki
nain mogu promeniti stanje promenljive ORIGIN:
MyMath.ORIGIN.setX(4);

170/15

static metod

U primeru je dodata re "static" i pred deklaracije


metoda square():
public static double square(doublex) {
return x * x;
}
Sada je metod square() podeljen izmeu svih
instanci ove klase postoji samo jedan square
metod za celu klasu, ne jedan za svaku instancu

SI1P1 2004

SI1P1 2004

171/15

Statiki metodi ne vre operacije da specifinim


instancama njihovih klasa
Ovi metodi imaju pristup samo statikim poljima i
metodama klase
Ne mogu pristupiti nijednom elemntu koji je nestatiki
Metodi klase" je bolja definicija
Suprotni termin je metodi instance"

SI1P1 2004

172/15

43

Math klasa

Primeri static polja

Detaljniji pregled klase Math u okviru Javinog API


Ne moe se kreirati instanca klase Math, ona slui
za smetanje korisnih static metoda
Svi metodi i polja su static:
Math.sqrt(16)
Math.PI
Math.abs(-3)

SI1P1 2004

173/15

Primeri static metoda

SI1P1 2004

174/15

Pitanja

Za metode koji koriste samo argumente i na taj


nain ne koriste instance
public static double pow(double b, double p)
// Math class,
Za metode kojima trebaju samo static podaci
Takoe, koristi se i kod main metoda kod klase
pomou koje se startuje program
U trenutku startovanja programa ne postoji objekti
koje bi main metod mogao da koristi

SI1P1 2004

Konstante koje se koriste u okviru klasa (uobiajeno


je da su deklarisane pomou final)
Potrebna je samo jedna po klasi, nije potrebna po
jedna u svakom objektu
Sledea deklaracija:
public static final double TEMP_CONVERT= 1.8;
Ako se ova deklaracija promenljive TEMP_CONVERT
nalazi u okviru klase Temperature, moe se koristiti
na sledei nain:
double t = Temperature.TEMP_CONVERT * temp;
Tradicionalno (C, C++) konstante se piu velikim
slovima, PI , TEMP_CONVERT, ...

175/15

Da li sledei podaci treba da budu static ili nestatic?


Podatak koji definie brzinu svetlosti
getName() metod u okviru klase Person
zbir() metod koji kao rezultat vraa zbir dva svoja
argumenta
Podatak koji definie irinu u okviru Rectangle klase
static
non
static
non

SI1P1 2004

176/15

44

Pristup i organizacija

Uvod u programiranje 1 Java


Organizacija
Organizacija podataka i kontrola pristupa

SI1P1 2004

177/15

U ovoj lekciji

Na raunaru postoji hiljade fajlova.


Na Internetu postoji vie miliona sajtova.
Projekat moe imati hiljade klasa.
Kako pronai odreenu klasu, fajl ili sajt?
Kako organizujemo rad u sluaju istih ili
slinih imena?
Kako se moe ograniiti pristup privatnim
podacima?

SI1P1 2004

Oblast vaenja

Oblast vaenja: Odakle moemo pristupiti


pojedinanim podacima.
Kako se koriste Java paketi.
Kako se kreiraju Java paketi.

SI1P1 2004

178/15

179/15

Oblast vaenja promenljive, polja, metode ili klase


je deo programa iz koga se moe pristupiti ovim
elementima.
Promenljivama se moe pristupiti iz bloka u okviru
koga su deklarisane.
Block se oznaava pomou { i }.
Lokalne promenljive: Promenljive koje su definisane
samo u trenutnom bloku.
Pristup polju, metama i klasama je definisana
pomou njihovih specifikatora.

SI1P1 2004

180/15

45

Anonimne promenljive

Primer oblasti vaenja promenljive

Anonimne promenljive se deifiniu i


inicijalizuju, ali se nikada ne deklariu.
U jezicima C i C++ anonimne promenljive se
tretiraju kao greka, u Javi ne.
Ove promenljive nemaju ime i ne mogu se
pozivati pa nemaju oblast vaenja.
Primeri:
System.out.println(Hello);
(new String(Hello))
(new int[] {1,2,3,4})
(Poslednji primer sadri elemente koji e se
razmatrati kasnije)

0
void foo(int x) {
1
int y = 3;
2
if (y > 0) {
3
int z= 4;
4
if (z> 0) {
5
int w= 0;
6
{
7
int v = 1;
8
} // end block
9
} // end if (z>0)
10
} // end if (y>0)
11
} // end
Iz kojih linija koda se moe pristupiti
promenljivama v, w, x, y, i z?

SI1P1 2004

181/15

Primer oblasti vaenja metoda


class TestScope {
int x = 0;
void foo(int z) {
int y = 20;
x = 10;
int z = 30; // Error
}// end foo()
void print() {
System.out.println(x);
foo(x);
System.out.println(x);
/* Next line error */
System.out.println(y);
}// end print()
}// end TestScope
x je definisano za celu klasu
y je definisano u okviru metoda f(int).
SI1P1
2004
z je ve definisan u f(int) jer je argument metoda.

SI1P1 2004

182/15

Primer oblasti vaenja polja

183/15

class Scope{
int x = 3;
void foo(int y) {
System.out.println(x);
int x = 2;
System.out.println(x);
System.out.println(this.x);
System.out.println(y);
}
public static void main(String[] args) {
int x = 1;
(new Scope()).foo(x); // AnonymousObject
}
}
SI1P1
2004
ta je rezultat izvravanja programa?

184/15

46

Primer oblasti vaenja i petlje

Pitanje

int sigma(int n) {
for (int i = 0; i<n; i++) {
int sum += i;
}
return sum;
}
Metod sigma bi trebalo da generie rezultat koji je
jednak
Zato se javlja greka pri kompajliranju?

SI1P1 2004

185/15

Pitanje 2

186/15

Pitanje 3

class TestScope {
int x = 0;
int y = 0;
void foo() {
int y;
y = 20;
x = 10;
}
void print() {
System.out.println(x);
foo();
System.out.println(x);
System.out.println(y);
}
}
ta se sada dobija na izlazu kao rezultat izvravanja programa?
0
10
0

SI1P1 2004

class TestScope {
int x = 0;
void foo() {
int y = 20;
x = 10;
}// end foo
void print() {
int y = 0;
System.out.println(x);
foo();
System.out.println(x);
System.out.println(y);
}// end print()
}// end Class TestScope
ta se dobija na izlazu kao rezultat izvravanja programa?
0
10
SI1P1 2004
0

187/15

class TestScope {
int x = 0;
int y = 0;
void foo() {
y = 20;
x = 10;
}
void print() {
System.out.println(x);
foo();
System.out.println(x);
System.out.println(y);
}
}

ta se sada dobija na izlazu kao rezultat izvravanja programa?


0
10
SI1P1 2004
20

188/15

47

Imenovanje promenljivih u velikim projektima

Hijerarhijska organizacija

Veliki projekti mogu imati na hiljade klasa.


Moete saraivati i deliti klase sa ljudima koji se
nalaze irom sveta.
Kako da budete sigurni da se ime vae klase nee
poklopiti sa nekim imenom neke druge?
Moete koristiti dugaka jedinstvena imena..
UtilityClassForPreparingTaxReturnsByAnthonyGfrom
WestlandsNairobiKenya
Ovakav nain je teak za pamenje i korienje.

SI1P1 2004

189/15

Imena su organizovana u hijerarhijski raspored.


Bill Gates: Porodica: Gates, lan: Bill.
rti.etf.bg.ac.yu
254-020-5555555: Kenya (254), Nairobi (020), Broj
5555555
java.lang.String: String je klasa, u okviru lang
paketa, koji se nalazi u okviru osnovnog java
paketa.

SI1P1 2004

Definicija paketa

Paketi

Potrebno je organizovati klase u skupove ili delove


programa koji se nazivaju paketi.
Na ovaj nain se smanjuje problem konflikta imena i
prepoznavanja funkcionalnosti, na primer java.util.
Moe se ograniiti pristup na nivou paketa.
Pripadnost klase paketu se definie sa:
package imePaketa;
class
imeKlase{
/* Telo klase */
}

SI1P1 2004

191/15

190/15

Deklaracija paketa mora biti prva linija u fajlu koja


nije komentar.
Prva klasa definisan au okviru fajla mora da ima isto
ime kao i ime fajla.
Samo prva klasa moe biti tipa public.
javac i java e traiti navedene poddirektorijume ili
JAR (Java Archive) fajlove za navedeni kod:
putanja \mypkg\util za paket mypkg.util (na
Windows operativnom sistemu)
putanja /mypkg/util/arrays za paket
mypkg.util.arrays (na Unix operativnom sistemu)

SI1P1 2004

192/15

48

Korienje paketa

Specifikatori pristupa

Mogu se korisno definisati imena:


java.util.Date d = new java.util.Date();
Ili specifirati klase koje se ele koristiti:
import java.util.Date;
import java.util.ArrayList;
Mogu se koristiti sve klase iz paketa:
import java.util.*;
Paketi mogu imati pod-pakete:
import java.util.logging.*;
Default korieni paket:
import java.lang.*;

SI1P1 2004

193/15

Nivoi kontrole pristupa

Polja, metode, konstruktori i klase koje su


definisane kao public omoguavaju pristup iz bilo
koje klase bilo kog paketa.
Polja, metode, konstruktori i klase koje su
definisane kao protected omoguavaju pristup samo
klasama koje ih nasleuju.
Polja, metode, konstruktori i klase koje su
definisane sa paketnim pristupom omoguavaju
pristup iz bilo koje klase istog paketa. Ovakav
pristup se podrazumeva.
Polja, metode i konstruktori koji su definisani kao
private omoguavaju pristup samo kodi iz klase u
kojoj se pojavljuju.

SI1P1 2004

194/15

Primer
package examples;
class Person {
String name;
//Telo klase ce se dopuniti:
// Dodavanjem polja za rodjendan
// Dodavanjem metoda za definisanje rodjendana
// Dodavanjem metoda za citanje rodjendana
}

SI1P1 2004

195/15

SI1P1 2004

196/15

49

Primer

Primer

package examples;
class Person {
String name;
java.util.Date birthDay;
void setBirthday(java.util.Date d) {
this.birthDay = d;
}
java.util.Date getBirthday() {
return this.birthDay;
}
}

SI1P1 2004

package examples;
import java.util.Date;
class Person {
String name;
Date birthDay;
void setBirthday(Date d) {
this.birthDay = d;
}
Date getBirthday() {
return this.birthDay;
}
}
197/15

Primer

198/15

Primer
package examples;
import java.util.*;
class Person {
String name;
ArrayList friends;
Date birthDay;
void setBirthday(Date d) {
this.birthDay = d;
}
Date getBirthday() {
return this.birthDay;
}
}

package examples;
import java.util.Date;
import java.util.ArrayList;
class Person {
String name;
ArrayList friends;
Date birthDay;
void setBirthday(Date d) {
this.birthDay = d;
}
Date getBirthday() {
return this.birthDay;
}
}
SI1P1 2004

SI1P1 2004

199/15

SI1P1 2004

200/15

50

Pojam nasleivanja

U stvarnom svetu: Mi nasleujemo svoje


gene od roditelja. Nasleujemo gene i od
drugih predaka. Moemo imati razliite oi,
teinu, visinu . . . Ali i dalje veliki broj
osobina nasleujemo od naih roditelja.
U svetu softvera: Nasleivanje kod objekata
je mnogo bolje definisano! Objekti koji
nasleuju neke druge objekte, od njih
nasleuju i stanja (polja) i ponaanje
(metode).

Uvod u programiranje 1 Java


Nasleivanje

SI1P1 2004

201/15

SI1P1 2004

Klasa Masai

Klasa Kikuyu

public class Masai{


private String name;
private int cows;
public Masai(String n, int c) {
name = n;
cows = c;
}
public String getName() { return name; }
public int getCows() { return cows; }
public void speak() {
System.out.println(Masai");
}
}

public class Kikuyu {


private String name;
private int money;
public Kikuyu(String n, int m) {
name = n;
money = m;
}
public String getName() { return name; }
public int getMoney() { return money; }
public void speak() {
System.out.println(Kikuyu");
}
}

SI1P1 2004

203/15

SI1P1 2004

202/15

204/15

51

Problem: dupliranje koda

Primer

Prethodne dve klase imaju isto polje name i


isti metod getName
Klase esto imaju veliki broj zajednikh
polja i metoda
Dobijeni rezultat: dupliranje koda!
Koristei nasleivanje mogue je napisati
novu klasu koja nasleuje neku ve
postojeu
Postojea klasa ije osobine nasleuju
naziva se klasa roditelj" ili superklasa
Nova klasa koja nasleuje superklasu naziva
se klasa potomak" ili subklasa
Rezultat: Velika uteda koda!

SI1P1 2004

205/15

SI1P1 2004

Kenyan superklasa

Masai podklasa

public class Kenyan {


private String name;
public Kenyan(Stringn) {
name = n;
}
public String getName() {
return name;
}
}

public class Masai extends Kenyan{


private int cows;
public Masai(String n, int c) {
super(n); // poziv Kenyan konstruktor
cows = c;
}
public int getCows() {
return cows;
}
public void speak() {
System.out.println(Masai");
}
}

SI1P1 2004

207/15

SI1P1 2004

206/15

208/15

52

Kikuyu podklasa

Pitanje

public class Kikuyu extends Kenyan{


private int money;
public Kikuyu(String n, int m) {

ta se dobija na izlazu?
Masaid = new Masai(Johnson" 23);
Kikuyu c = new Kikuyu(Sheila", 2200);
System.out.println(d.getName() + " has " +
d.getCows() + " cows");
System.out.println(c.getName() + " has " +
c.getMoney() + " shillings");
Johnson has 23 cows
Sheila has 2200 shillings

super(n); // poziv
money = m;

Kenyan konstruktor

}
public int getMoney() {
return money;
}
public void speak() {
System.out.println(Kikuyu");
}
}
SI1P1 2004

209/15

SI1P1 2004

210/15

Pravila nasleivanja

Konstruktor podklase

Koristi se slubena re extends da bi se


naznailo koja klasa nasleuje koju
klasu
Podklasa nasleuje sva polja i sve
metode superklase
Koristi se slubena re super u okviru
konstruktora podklasem da bi se
pozvao kontruktor superklase

Prva stvar koju konstruktor podklase


mora da uradi je da pozove
konstruktor superklase
Na ovaj nain se delovi koji pripadaju
super klasi konstruiu pre delova koji
su deo same podklase
Ako se ne pozove konstruktor
superklase pomou naredbe super i
superklasa ima konstruktor bez
argumenata, tada e se taj konstuktor
pozati implicitno.

SI1P1 2004

211/15

SI1P1 2004

212/15

53

Pitanje

Primer
Ako je data klasa Food:
public class Food {
private boolean raw;
public Food() {
raw = true;
}
}
I podklasa Beef:
public class Beef extends Food
{
private double weight;
public Beef(double w ) {
weight = w
}
} 2004
SI1P1

public class A {
public A() { System.out.println("I'm A"); }
}
public class B extends A {
public B() { System.out.println("I'mB"); }
}
public class C extends B {
public C() { System.out.println("I'mC"); }
}
ta e se pojaviti na ekranu nakon sledee naredbe?
C x = new C();

Je ekvivalentno sa:
public class Beef extends Food
{
private double weight;
public Beef(double w) {
super();
weight = w
}
}

I'm A
I'm B
I'm C
213/15

Preklapanje metoda

SI1P1 2004

214/15

Poziv metoda superklase

Podklasa moe preklopiti odgovarajui metod svoje superklase

Kada se preklopi odreeni metod, mogue je pozvati


kopiju tog metoda superklase koristei naredbu
super.metod()

ta se dobija na izlazu nakon izvravanja sledeih naredbi?


ThermUS thermometer = new ThermUS(100);
System.out.println(thermometer.getTemp());
212
SI1P1 2004

215/15

SI1P1 2004

216/15

54

Koje se linije nee kompajlirati

SI1P1 2004

Konverzija tipova

217/15

Primer

218/15

Primer

Kompanija ima listu Zaposlenih. Potrebno je


napraviti stranicu za plaanje z asvakog zaposlenog.
Na stranici se prikazuju opti podaci (ime,
odeljenje, koliina plaanja, ) za sve zaposlene.
Razliiti tipoi zaposenih menader, inenjerm
sotverski inenjer
Postoji stara verzija klase Employee ali je potrebno
doti veoma razliite podatke i metode za menadere
i inenjere.
Neka je neko ukljuio staru Employee klasu u ssem.
U okviroe klase postoji metod printData() za svaog
zaposlenog i ovaj metod samo prikazuje ime
zaposlnog. Potrebno je ovo promeniti, tako da se
prikazuju i informacije o plaanju

SI1P1 2004

SI1P1 2004

219/15

SI1P1 2004

220/15

55

Primer

Primer

class Employee {
// Data
private String firstName, lastName;
// Constructor
public Employee(String fName, String lName)
{firstName= fName; lastName= lName;}
// Method
public void printData()
{System.out.println(firstName+ " " + lastName);}
}

SI1P1 2004

221/15

SI1P1 2004

222/15

Primer

Primer

class Engineer extends Employee {


private double wage;
private double hoursWorked;
public Engineer(String fName, String lName, double
rate, double hours){
super(fName, lName);
wage = rate;
hoursWorked= hours;
}
public double getPay() {
return wage * hoursWorked;}
public void printData() {
super.printData();
// PRINT NAME
System.out.println("Weeklypay: $" + getPay(); }}

class Manager extends Employee {


private double salary;
public Manager(String fName, String lName,
double sal){
super(fName, lName);
salary = sal; }
public double getPay() {
return salary; }
public void printData() {super.printData();
System.out.println("Monthly salary: $" +
salary);}}

SI1P1 2004

223/15

SI1P1 2004

224/15

56

Primer

Primer

class SalesManager extends Manager {


private double bonus;
// Bonus Possible as commission.
// A SalesManagergets a constant salary of $1250.0
public SalesManager(StringfName, String lName,
double b) {
super(fName, lName, 1250.0);
bonus = b; }
public double getPay() {return 1250.0; }
public void printData() {super.printData();
System.out.println("BonusPay: $" + bonus; }
}
SI1P1 2004

225/15

SI1P1 2004

Primer

Klasa Object

public class PayRoll{


public static void main(String[] args) {
fred= new Engineer("Fred", "Smith", 12.0, 8.0);
Manager ann= new Manager("Ann", "Brown",
1500.0);
SalesManager mary= new SalesManager("Mary",
"Kate", 2000.0);
employees = new Employee[3];
employees[0]= fred;
employees[1]= ann;
employees[2]= mary;
for (int i=0; i < 3; i++)
employees[i].printData();
}
}

SI1P1 2004

227/15

226/15

Sve Javine klase implicitno nasleuju klasu


java.lang.Object
Tako da svaka klasa koja se napie automatski ima
neke metode koji pripadaju klasi Object, kao o su
equals, hashCode, i toString.
Neki od ovih metoda e se obraivati u kasnijim
lekcijama

SI1P1 2004

228/15

57

U ovoj lekciji

ta predstavlja izuzetak
Uobiajena terminologija
Zato koristiti izuzetke
Kako se deava izuzetak
Kako se obrauje izuzetak
O izuzecima koji se moraju obraditi i o
onima koji se ne moraju
Primeri Java izuzetaka
Kako napisati svoj sopstveni izuzetak

Uvod u programiranje 1 Java


Obrada gre
greaka pomo
pomou izuzetaka

SI1P1 2004

229/15

ta predstavlja izuzetak?

230/15

Terminologija

Izuzetak je dogaaj koji se dogodio tokom


izvravanja programa i moe da prouzrokuje prekid
normalnog toka izvravanja instrukcija
Mogui razlozi izuzetaka:
Pristup elementu izvan granica niza
Pokuaj upisa u read-only dokument
Pokuaj itanja nakon kraja dokumenta
Slanje nelegalnih argumenata nekom metodu
Nelegalne aritmetike operacije (n.p. deljenje sa 0)
Otkaz hardverskih resursa

SI1P1 2004

SI1P1 2004

231/15

Kada se izuzetak (exception) dogodi koristi se izraz


da je baen izuzetak (throw)
Kada se izvre odreene operacije sa izuzetkom
kae se da je izuzetak obraen (handled)
Deo koda pomou koga se izvre odreene operacije
sa izuzetkom naziva se obrada izuzetaka (exception
handler)

SI1P1 2004

232/15

58

Zato koristiti izuzetke

Pomou kompajliranja ne mogu se odrediti sve


greke
Na ovaj nain se odvaja kod za obradu izuzetaka od
ostalog, regularnog koda

Poruke kod izuzetaka

Jasnoa i razumljivost koda (debagovanje, timski rad, ...)


Obrada izuzetaka se izvrava samo na jednom mestu

Odvojeni su delovi koda za prepoznavanje greke,


izvetavanje i obradu
Mogu se grupisati i odvojiti razliiti tipovi greaka
Mogu se obraditi greke koje prouzrokuju veoma
specifine izuzetke

233/15

SI1P1 2004

Poruke kod izuzetaka

SI1P1 2004

234/15

Primeri

Poruke od izuzetaka imaju sledei format:

[exception class]: [additional


description of exception] at
[class].[method]([file]:[linenumber])

SI1P1 2004

public class ArrayExceptionExample{


public static void main(String args[]) {
String[] names = {Bilha", Robert"};
System.out.println(names[2]);
}
}
Naredba println u navedenom kodu e dovesti do
greke i sledee poruke pri obradi datog izuzetka:
Exception in thread "main"
java.lang.ArrayIndexOutOfBoundsException: 2 at
ArrayExceptionExample.main(ArrayExceptionExample.j
ava:4)

235/15

Poruka kod izuzetka u primeru sa nizovima


java.lang.ArrayIndexOutOfBoundsException: 2 at
ArrayExceptionExample.main(ArrayExceptionExample.j
ava:4)
Koja je klasa izuzetka?
java.lang.ArrayIndexOutOfBoundsException
Kom indeksu niza se pristupa, a on je izvan granica?
2
Koji metod generie izuzetak?
ArrayExceptionExample.main
Koji fajl sadri ovaj metod?
ArrayExceptionExample.java
Koja linija fajla generie izuzetak?
4

SI1P1 2004

236/15

59

Generisanje izuzetaka

Obrada izuzetaka

Svi metodi mogu koriste naredbu throw da bi


prihvatili izuzetak
if (student.equals(null))
throw new NullPointerException();
Naredba throw zahteva poseban argument:
throwable objekat
Ova vrsta objekata je instanca bilo koje podklase
Throwable klase
Ova klasa obuhvata sve tipove greaka i izuzetaka
U okviru opisa API mogu se pronai i opisi svih
throwable objekata

Moe se koristiti try-catch blok da bi se obradio


izuzetak koji se desio
try{
// kod u okviru koga moe da se desi izuzetak
}
catch([Tip izuzetka] e) {
// ta da se izvri ako se desio izuzetak
}

SI1P1 2004

237/15

SI1P1 2004

Obrada vie izuzetaka istovremeno

finally blok

Vie moguih izuzetaka se moe istovremeno


obraditi pomou vie sukcesivnih catch blokova
try{
// kod u okviru koga moe da se desi vie izuzetaka
}
catch (IOException e) {
// obrada IOException
}
catch (ClassNotFoundException e2) {
// obrada ClassNotFoundException
}

SI1P1 2004

238/15

Moe se koristiti opcioni finally blok na kraju try-catch bloka


finally blok obezbeuje mehanizam da regulie sve to se deilo
u okviru try bloka
Moe se iskoristiti za zatvranje fajla ili oslobaanja nekog
drugog resursa
Try-Catch-Finally Blok

try{
// kod u okviru koga moe da se desi izuzetak
}
catch([Type of Exception] e) {
// ta da se izvri ako se desio izuzetak
}
finally{
// naredbe u okviru bloka e se uvek izvriti
// bez obzira ta e se dogoditi u okviru bloka
}
239/15

SI1P1 2004

240/15

60

Izuzeci koji se mogu proveriti

Izuzeci koji se ne mogu proveravati

Izuzeci koji se ne mogu proveravati (unchecked


exceptions) ili runtime izuzeci se pojavljuju u okviru
Java runtime sistema
Primeri ovih izuzetaka
Aritmetike operacije (deljenje sa nulom)
pointer exceptions (pokuaj da se pristupi lanu
objekta pomou null reference)
Izuzeci sa indeksima (pokuaj da se pristupi
elementu niza sa indeksom koji je preveliki ili
premali)
Metod koji ne sadri catch ili specificira da moe da
generie unchecked exceptions, takoe moe u
nekim sluajevima ih generisati

SI1P1 2004

241/15

Obrada izuzetaka koji se mogu proveriti


Svaki metod mora obraditi izuzetak koji se moe proveriti ili
specificirati da takav izuzetak postoji (korienjem throws
naredbe)
void readFile(Stringfilename) {
try {
FileReaderreader = new
FileReader("myfile.txt");
// read from file . . .
} catch (FileNotFoundExceptione) {
System.out.println("filewas not found");
}
}
ILI
void readFile(Stringfilename) throws
FileNotFoundException{
FileReaderreader = new FileReader("myfile.txt");
// read from file . . .
}
SI1P1 2004

Izuzeci koji se mogu proveriti (checked exceptions)


ili non-runtime exceptions su izuzeci koji se mogu
desiti izvan Java runtime sistema
Na primer izuzeci koji se mogu desiti tokom
ulazno/izlaznih operacija su non-runtime izuzeci
Kompajler proverava da li su non-runtime izuzeci
obraeni (ili specificirani korienjem throws
naredbe)

SI1P1 2004

242/15

Hijerarhija klasa

243/15

SI1P1 2004

244/15

61

Nasleivanje i izuzeci

Pisanje sopstvenih izuzetaka

Metod moe specificirati manje izuzetaka, ali ne


vie od metoda koji nasleuje
public class MyClass {
public void doSomething() throws IOException,
SQLException {
// do something here
}
}
public class MySubclass extends MyClass {
public void doSomething() throws IOException {
// do something here
}
}

Postoje najmanje 2 tipa konstruktora izuzetaka:


Default konstruktor: bez argumenata
NullPointerExceptione = new NullPointerException();
Konstruktor koji ima detaljnu poruku: postoji jedan
String argument
IllegalArgumentExceptione e =
new IllegalArgumentException(Broj mora biti
pozitivan");

SI1P1 2004

245/15

SI1P1 2004

Pisanje sopstvenih izuzetaka

Checked ili Unchecked?

Sopstveni izuzeci moraju biti podklase klase Exception i


moraju imati najmanje dva standardna konstruktora
public class MyCheckedException extends
IOException{
public MyCheckedException() {}
public MyCheckedException(String m){
super(m);}
}
public class MyUncheckedException extends
RuntimeException{
public MyUncheckedException() {}
public MyUncheckedException(String m)
{super(m);}
}

SI1P1 2004

247/15

246/15

Ako korisnik oekuje da se izuzetak pojavi, trebalo


bi da bude tipa checked
Ako korisnik ne moe da preduzme nita da bi se
oporavio od datog izuzetka, trebalo bi da bude
unchecked tipa

SI1P1 2004

248/15

62

Sadraj lekcije

Izuzeci naruavaju normalno izvravanje instrukcija


u okviru programa
Izuzeci se obrauju pomou try-catch ili try-catchfinally bloka
Metod specificira postojanje izuzetka pomou throw
naredbe
Metod koji nema catch deo ili ne specificira da
postoji unchecked izuzetak, moe da ga generie
Svaki metod mora obraditi checked izuzetke ili
specificirati da postoje
Ako se pie spostveni izuzetak, on mora biti
podklasa klase Exception i imati najmanje dva
standardna konstruktora

SI1P1 2004

249/15

U ovoj lekciji

250/15

SI1P1 2004

Osnove ulaz/izlaz

Lekcija je podeljena u dva glavna dela:


I Ulaz/Izlaz:
Ulaz ili Izlaz, i Byte ili Character nizovi
Najvanije Stream klase i njihova upotreba
Primeri itanja iz i upisa u tekstualni fajl
Primeri prihvatanja teksta sa tastature
Upotreba bafera
II Uvod u postupak parsiranja:
Delimiteri
StringTokenizer

SI1P1 2004

Uvod u programiranje 1 Java


UlazUlaz-izlaz

I/O = Input/Output ulaz/izlaz komunikacija


izmeu raunarskog programa i spoljanjih izvora
informacija
Ukljuuje: - itanje ulaznih podataka iz izvora
Upis rezultata u krajnje odredite
itanje i upis su specifirani pomou 4 abstraktne
klase:

251/15

SI1P1 2004

Reader
Writer
InputStream
OutputStream

252/15

63

Java I/O Streams

Input i Output Stream

Java programi komuniciraju sa spoljanjim svetom


pomou Streams
Streams se koriste za itanje i upis podataka
I/O Streams su jednodirekcioni
Ulazni (Input) stream se koristi za ulazne podatke u
program
Izlazni (output) stream se koristi za podatke koji
predstavljaju rezultat izvravanja programa
Izvor i odredite podataka mogu biti: fajlovi,
mrene konekcije, drugi programi, ...

SI1P1 2004

253/15

Byte i Character

Objekat pomou koga moemo proitati ulazne


podatke je Input Stream

Objekat pomou koga moemo prikazati izlazne


podatke je Output Stream

SI1P1 2004

254/15

Najvanije Stream klase

Byte Streams se koristi da bi se itali i upisivali


podaci koji su u binarnom formatu (1 ili 0)
Na primer slike, zvuk, ...
Character Streams se koristi da bi se itali i upisivali
podaci koji su u tekstualnom formatu (karakteri)

Na primer tekstualni fajlovi, web stranice, unos


korisnika pomou tastature, ...

SI1P1 2004

255/15

FileInputStream

itanje podataka u binarnom formatu iz fajlova


FileOutputStream

Upis podataka u binarnom formatu u fajlove


FileReader

itanje tekstualnih podataka iz fajlova


FileWriter

Upis tekstualnih podataka u fajlove

SI1P1 2004

256/15

64

Rad sa Stream klasama

Java I/O klase

1. Otvaranje streama instanciranjem novog stream


objekta
2. Rad sa informacijama pomou read/write,
read/write u okviru metoda Stream klasa
3. Zatvaranje streama pozivom close() metoda datog
objekta

SI1P1 2004

257/15

Upotreba Reader klase

Paket java.io sadri klase koje s ekoriste za


itanje/upis podataka iz/u fajlove
Da bi se itali/upisivali podaci, moraju se intancirati
podklase jedne od sledee 4 abstraktne superklase:

SI1P1 2004

258/15

itanje iz tekstualnog fajla

Klasa Reader se koristi za itanje karaktera ulaznog


streama
Ova klasa sari metode za itanje pojedinanog
karaktera i niza karaktera, na primer
int read()
Klasa Reader je apstraktna, tako da se mora
instancirati u podklasi koja mora preklopiti ove
metode

SI1P1 2004

259/15

SI1P1 2004

260/15

65

BufferedReader klasa

Upotreba BufferedReader klase

BufferedReader je podklasa klase Reader


Skuplja (buffers) karakter stream iz FileReader i
sadri metod readLine() za efikasno itanje ulazne
linije karaktera
FileReader fr = new FileReader("myFile.txt");
BufferedReader br= new BufferedReader(fr);
Merod readLine() kao rezultat vraa vrednost null
ako nema vie linija za itanje

SI1P1 2004

261/15

262/15

Upis u tekstualni fajl

Klasa Writer

SI1P1 2004

Klasa Writer je apstraktna klasa koja se koristi upis


karakter stream-ova
Ova klasa sadri metode za upis pojedinanog
karaktera i stringova
Na primer void write(int c)
BufferedWriter (podklasa klase Writer) sadri
metode za efikasni upis
Metodom newLine() se upisuje prazna linija, a
metodom write(String n) se upisuju konkretni
podaci
Kada se zavri eljena operacija potrebno je
zatvoriti Write pomou metoda close()

SI1P1 2004

263/15

SI1P1 2004

264/15

66

Kopiranje fajlova

Prihvatanje podataka sa tastature

SI1P1 2004

265/15

Prihvatanje podataka sa tastature

SI1P1 2004

266/15

Zakljuak

SI1P1 2004

Unos podataka sa tastature u formi Streama se


oznaava kao "standardni" unos, ali za itanje
unetih podataka potrebno je koristiti objekat klase
Reader
InputStream se koristi kao prelazna klasa, koja
uzima podatke iz Streama i konvertuje ih u tip
Reader
Da bi se itali karakteri pomou InputStream,
potrebno ih je podeliti u okviru InputStreamReader
Da bi se itala linija po linija, potrebno je podeliti
InputStreamReader sa BufferedReader

267/15

Potrebno je prouiti hijerarhiju klasa InputStream i


OutputStream, kao i Reader i Writer u okviru Java
dokumentacije da bi se uoile sve postojee
podklase i metodi koji se mogu koristiti
Treba koristiti Java API!!!

SI1P1 2004

268/15

67

Parsiranje

Delimiteri

U okviru programa podaci se obino


konvertuju u tekstualni format pre nego to
se upiu u fajlove
Kasnije je potrebno upisane podatke iz
tekstualnih fajlova konvertovati u originalne
podatke
Proces dekodovanje teksta u podatke se jo
naziva i parsiranje

SI1P1 2004

269/15

StringTokenizer

SI1P1 2004

270/15

StringTokenizer

Kada se pokuava proitati nova ulazna linija, kao


rezultat se dobija jedan, u optem sluaju dugaki
string.
Potrebno je pronai delimitere u okviru tog stringa i
odvojiti svaki pojedinani deo informacije (tokens)
Da bi se obavila ova operacija koristi se klasa
StringTokenizer u okviru paketa java.util

SI1P1 2004

Kada su podaci smeteni u tekstualnom formatu,


delimiter karakteri se koriste da bi se odvojili delovi
(tokens) podataka
Na primer pojedinana imena u listi su odvojena
pomou delimitera '#':
Lana#Pera#Maja#Mika
Ista lista sa delimiterom novom linijom:
Lana
Pera
Maja
Mika
Ostali delimiteri koji se koriste su | ili : ili tab

271/15

Kada se formira tokenizer objekat, potrebno je


specificirati koji se karakteri koriste kao delimiteri u
konkretnom sluaju
Default konstruktori pretpostavljaju da su \t\n\r
delimiteri
StringTokenizerr = new StringTokenizer(line);
Drugi konstruktori prihvataju kao argument String
koji moe definisati proizvoljan niz karaktera kao
delimiter

String line = myFile.readline();


StringTokenizert = new StringTokenizer(line, #);
StringTokenizers = new StringTokenizer(line, ,\&\|);

SI1P1 2004

272/15

68

StringTokenizer

StringTokenizer

Korisni StringTokenizer metoda:


Metod nextToken() u formi stringa kao rezultat
vraa sledei podatak izmeu delimitera u okviru
teksta
Metod hasMoreTokens() u formi boolean vraa
rezultat true ako se u tekstu nalazi jo tokena

SI1P1 2004

273/15

SI1P1 2004

274/15

Parsiranje brojeva

esto je potrebno parsirati brojeve smetene kao


tekst u okviru Java promenljivih
Klase koje sadre statike metode za razne
konverzije su
int Integer.parseInt(Strings)
double Double.parseDouble(Strings)
Potrebno je obraditi izuzetak
NumberFormatException ako se specificirani String
ne moe konvertovati u okviru promenljive

SI1P1 2004

275/15

69

You might also like