Download as pdf or txt
Download as pdf or txt
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
Uvod u programiranje 1 Java svaki raunar razume
Uvod Primer Java koda i komentari

SI1P1 2004 1/15 SI1P1 2004 2/15

Pisanje programa i spremanje hrane Pisanje programa i spremanje hrane

SI1P1 2004 3/15 SI1P1 2004 4/15

1
ta predstavlja raunarski program Kompajliranje

Da bi raunar mogao da izvri odreene zadatke (na Raunari ne razumeju programe napisane u
primer odtampa ocene koje student dobije na ispitu), programskim jezicima kao to su Pascal i Java
moraju mmu se zadati instrukcije za obavljanje Programi se moraju prvo kompajlirati ili prevesti u
zadatka mainski kod koji raunar moe da izvrava
Skup instrukcija koje vode raunar da izvri odreeni Program i postupak pomou koga se kod
zadatak ine raunarski program programskog jezika prevodi u mainski kod naziva se
Mi piemo program (skup instrukcija) u programskim kompajler i kompajliranje
jezicima kao to su C, Pascal ili Java Razliite platforme, ili hardver sa operativnim
Koristimo ove programske jezike jer su razumljivi sistemom zahtevaju razliit mainski kod, programi
oveku se moraju odvojeno kompajlirati za razliite
Ali kako raunar razume instrukcije koje mu platforme
zadajemo?

SI1P1 2004 5/15 SI1P1 2004 6/15

Kompajliranje 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

2
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 SI1P1 2004 10/15

Izvravanje programa 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

3
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 14/15

Mane korienja Jave Primer

Izvravanje bytecode pomou interpretera je sporije /* HelloWorld klasa prikazuje Hello,


nego izvravanje mainskog koda, koji je specifian World! na ekranu */
za svaku posebnu platformu. public class HelloWorld {
Korienje specifinih mogunosti pojedine public static void main(String[] args) {
platforme (Windows taskbar) je teko pomou Java
jezika jer je platformski neutralan. // Prikaz Hello, World!
Da bi sse pokrenuo Java program na vie maina, System.out.println("Hello, World!");
mora se instalirati Java interpreter na svakoj od njih }
}

SI1P1 2004 15/15 SI1P1 2004 16/15

4
Komentari Pregled lekcije

Komentari se koriste da opiu napisani kod i da se bolje ta je program


razume smisao. Java kompajler ga ignorie. Kako napisati pravilno program za raunar
Komentari se dobijaju korienjem Prednosti i mane korienja Jave
//, to definie komentar do kraja linije Kako program napisan u Javi promeniti u formu koju
/* */, to definie komentar za sve to se nalazi svaki raunar razume
izmeu, ukljuujui vie linija Primer Java koda i komentari
Primeri dve vrste komentara:

/* HelloWorld klasa prikazuje Hello,


World! na ekranu */

// Prints Hello, World!


SI1P1 2004 17/15 SI1P1 2004 18/15

Uvod

ta su promenljive
Tipovi promenljivih
Imena promenljivih
Dodele vrednosti
Primitivni tipovi podataka
Uvod u programiranje 1 Java Ostali tipovi podataka (String)
Promenljive i osnovni tipovi podataka

SI1P1 2004 19/15 SI1P1 2004 20/15

5
Promenljive Promenljive

U matematikoj algebri, promenljive su simboli koji Promenljive se mogu predstaviti kao prazne kutije u
predstavljaju odreene vrednosti u formulama koje se mogu smestiti odreene vrednosti
Na kutiju se moe nalepiti nalepnica sa imenom, na
Na primer promenljiva x u sledeoj formuli primer KutijaX i koristiti vie puta
f(x)=x*2+2 Takoe mogu se obavljati odreene operacije, bez
Moe predstavljati bilo koju numeriku vrednost obzira na sadraj same kutije:
Pomeri KutijuX na policu A
Slino, promenljive u raunarskim programimasu Postavi predmet Z u KutijuX
simboli koji predstavljaju odreene podatke Otvori KutijuX
Ukloni sadraj iy KutijeX

SI1P1 2004 21/15 SI1P1 2004 22/15

Promenljive i Java Tipovi promenljivih u Javi

Promenljive u Javi imaju svoj tip. Celobrojni tipovi:


Tip promenljive definie koja vrsta vrednosti se int: veina brojeva se predstavlja pomou ovog
moe zapamtiti u okviru promenljive tipa
Analogija sa kutijom tip promenljive je veliina ili long: veliki brojevi, u oblasti istraivanja, finansija,
raunara.
oblik prazne kutije
short: mali brojevi, ne mnogo korisno.
U formuli
byte: veoma mali brojevi
f(x)=x*2+2 Floating Point (Decimalni) tipovi:
Promenljiva x je broj. float: Single-precision decimalni brojevi
Ako je x simbol koji predstavlja re Singidunum, double: Double-precision decimalni brojevi
formula nema smisla. Ostali tipovi:
String: tekstualni tip.
boolean: tano ili netano (true ili false)
SI1P1 2004 23/15 char: Alfanumeriki karakteri
SI1P1 2004 24/15

6
Deklaracija promenljivih u Javi Dodela vrednosti promenljivih u Javi

Promenljive se kreiraju tako to se deklarie njihov Dodela vrednosti promenljivih se obavlja koristei sledeu
tip i ime na sledei nain: sintaksu:
ime = vrednost;
tip ime;
Na primer:
Deklarisanje celobrojne promenljive sa imenom x: x = 100;
int x; pozdrav=Zdravo;
Deklarisanje stringa sa imenom pozdrav: Nelegalno je dodeliti promenljivoj vrednost pogrenog tipa:
String pozdrav; x = Zdravo;
x = 1.2;
U prethodnim primerima promenljive nisu dodeljene
pozdrav = 123;
vrednosti, ve su samo formirane prazne kutije
U okviru jednog koraka moe se promenljiva deklarisati i
dodeliti joj se vrednost
int x =100;
String pozdrav=Zdravo;
SI1P1 2004 25/15 SI1P1 2004 26/15

Imenovanje promenljivih u Javi Imenovanje promenljivih u Javi

Imena promenljivih (identifikatori) mogu biti Java je case-sensitive razlikuju se mala i velika
proizvoljne duine, ali moraju poeti sa: slova.
slovo (a z), Bosko nije isto kao bosko, odnosno BOSKO.
znak dolar ($), Treba birati imena promenljivih koja su
ili, donjom crtom ( _ ). informativna.
Imena promenljivih ne mogu sadravati specijalne Dobar izbor: int studentIspitOcena;
operacione simbole kao to su +, -, *, /, &, %, ^, ... Lo izbor: int tempvar3931;
Korienje rezervisanih rei Jave je takoe Preporuka je da imena promenljivih poinju malim
nelegalno. slovom i da svaka re unutar imena poinje sa
Na primer class, static, int, ... velikim: studentIspitOcena.

SI1P1 2004 27/15 SI1P1 2004 28/15

7
Imenovanje promenljivih u Javi Celobrojni tip

Koja imena su validna? Postoje etiri osnovna celobrojna tipa podataka:


byte, short, int, long.
1.$amount Svaki tip ima maksimalnu vrednost, baziranu na
2.6tally njihovoj binarnoj reprezentaciji:
3.my*Name Bytes: 8-bits, 128
4.salary Short: 16-bits, 215 32,000
5._score Int: 32-bits, 231 2 billion
6.first Name Long: 32-bits, 263 veoma veliko
7.total# Integer Overflows: ta se deava ako se pokua
smestiti vea vrednost u tip podataka?
8.short

SI1P1 2004 29/15 SI1P1 2004 30/15

String tip Racionalni tip

String nije primitivan tip podataka. Oni nasleuju Inicijalizuju decimalnu vrednost broja:
klasu Object, diskutovae se kasnije. double y = 1.23;
String je niz karaktera izmeu apostrofa i na double w = -3.21e-10; // -3.21x10-10
primerneki tekst. Koristi se d da bi se vrednost prikazala kao
decimalna:
Stringovi mogu koristiti specijalan operator + koji double y = 1d/3; // y = .333333333
kreira novi String: double z = 1/3; // z = 0.0 Zato?
String pozdrav= Zd+ ravo; Float se moe definisati kao i double, ali treba
String josJedanPozdrav= pozdrav+ !; dodati i f:
float z = 1.23f;
Double je precizniji nego Floats, ali izvravanje
operacija due traje
SI1P1 2004 31/15 SI1P1 2004 32/15

8
Logiki tip Karakter

Boolean (logiki tip) je tip podataka koji se koristi u Karakter je tip podataka koji se koristi da bi se
situacijama kada postoje dve opcije tano ili predstavio pojedinaan karakter, kao to je slovo,
netano (true ili false). broj, odreeni znak ili neki drugi simbol.
Vrednosti true i false su case sensitive. Ne prihvata Karakteri su pojedinani simboli smeteni izmeu
se True ili TRUE. jednostrukih navodnika
Ovaj tip podataka se koristi za testiranje osobina Ne treba ih izjednaavati sa String-ovima.
podataka i za kontrole toka Primer:
Primer: char prvoSlovoImena = 'e' ;
boolean daLiCitati = true; char pitanje = '?' ;
boolean fileOpen = false;

SI1P1 2004 33/15 SI1P1 2004 34/15

Pitanja Iskazi

Koje tipove podataka treba koristiti za sledee informacije?: Iskazi su komande koje dovode do odreenih
1. Broj stanovnika Srbije dogaaja
2. Broj stanovnika na Zemlji Svi iskazi moraju se zavravati sa ;
3. i
Deklarisanje promenljiv je jedan iskaz
4. Status dokumenta (otvoren/zatvoren)
5. Ime Dodeljivanje vrednosti promenljivoj je jedan iskaz
6. Prvo slovo imena Poziv metoda ili funkcije su iskazi:
7. $ 237.66 System.out.println(Hello, World);
int U narednim lekcijama emo uiti kako da se
long kontrolie izvravanje iskaza
double
boolean
String
char
SI1P1 double
2004 35/15 SI1P1 2004 36/15

9
Rezervisane rei Tipovi podataka

SI1P1 2004 37/15 SI1P1 2004 38/15

Tipovi podataka

Uvod u programiranje 1 Java


Operatori

SI1P1 2004 39/15 SI1P1 2004 40/15

10
Uvod ta su operatori

ta su operatori Operatori su specijalni simboli koji se koriste za:


Aritmetiki operatori, kao to su +, - -matematike funkcije
Operator dodele vrednosti -iskaze dodele vrednosti
Inkrement/Dekrement operatori, ++ -logika uporeivanja
Relacionalni operatori Primeri upotrebe operatora:
Kondicionalni operatori 3+5 // korienje + operatora
14 + 5 4 * (5 3) // korienje +, -, *
operatora
Izrazi su kombinacija promenljivih, konstanti i
operatora i definiu odreenu vrednost

SI1P1 2004 41/15 SI1P1 2004 42/15

Grupe operatora Aritmetiki operatori

Postoji 5 razliitih groupa operatora: Java ima 6 osnovnih aritmetikih operatora:


Aritmetiki operatori, + sabiranje
Operator dodele vrednosti
Inkrement/Dekrement operatori
- oduzimanje
Relacionalni operatori * mnoenje
Kondicionalni operatori / deljenje
U nastavku predavanja svaka grupa e se razmatrati % modul (ostatka)
detaljno
^ eksponent
Prioritet ili izvravanje operacija koje se nalaze u
okviru izraza moe se definisati u akronimu
PEMDAS.

SI1P1 2004 43/15 SI1P1 2004 44/15

11
Proritet izvravanja operacija Proritet izvravanja operacija

Proritet izvravanja operacija(PEMDAS) Primer: 10 + 15 / 5;


1.Parentheses - zagrade Rezultat se razlikuje u zavisnosti od toga da li se
2.Exponents - eksponenti prvo izvrava sabiranje ili deljenje
3.Multiplication and Division from left to right (10 + 15) / 5 = 5
mnoenje i deljenje posmtrano sa leve strane ka 10 + (15 / 5) = 13
desnoj Ako ne postoje zagrade Java e izvriti drugi sluaj
4.Addition and Subtraction from left to right - Trebalo bi koristiti uvek zagrade da bi se izbegla
sabiranje i oduzimanje posmtrano sa leve strane ka konfuzija
desnoj

SI1P1 2004 45/15 SI1P1 2004 46/15

Celobrojno deljenje Operator dodele vrednosti

U prethodnom primeru rezultat deljenja (10 + 15) / 5 je bio Osnovni operator dodele (=) dodeljuje
celobrojan (5).
Ali ta se deava ako hocmo da izvrimo operaciju 63 / 35?
vrednost ex promenljivoj var
U zavisnosti od tipa podatka u kome su smeteni brojevi, var= expr;
dobijamo razliite rezultate.
int i= 63;
Java dozvoljava da se kombinuju aritmetiki
int j= 35; i operator dodele u jedinstven operator
System.out.println(i/ j); Primeri:
Izlaz: 1
double x= 63;
x= x+ 5; je isto to i x+= 5;
double y= 35; y= y* 7; je isto to i y*= 7;
System.out.println(x/ y);
Izlaz: 1.8
Rezultat celobrojnog deljenja je samo ceodeo dobijenog
rezultata!
SI1P1 2004 47/15 SI1P1 2004 48/15

12
Inkrement/dekrement Inkrement/dekrement

++ se zove inkrement operator. Koristi se da bi se Inkrement / dekrement operator ima dve forme :
poveala vrednost promenljive za 1. -Prefix forma ++i; --i;
Na primer: -Postfix forma i++; i--;
i= i+ 1; Prefix forma prvo doda/oduzme 1 od promenljive i
Moe se napisati i kao: tek onda nastavi sa ostalim operatorima u izrazu
++i; Primer:
ili i++; int numOranges= 5;
-- se zove dekrement operator. Koristi se da bi se int numApples= 10;
smanjila vrednost promenljive za 1. int numFruit;
i= i-1; numFruit= ++numOranges+ numApples;
Moe se napisati i kao : numFruit je dobio vrednost 16
--i; numOranges je dobio vrednost 6
ili i--;
SI1P1 2004 49/15 SI1P1 2004 50/15

Inkrement/dekrement Relacionalni operatori

Postfix forma i++, i -- prvo izvri ceo izraz, pa onda Relacionalni operatori uporeuju dve vrednosti
povea/smanji vrednost promenljive Dobijeni rezultat je logikog tipa (true ili false) u
Primer: zavisnosti od relacije operanada
int numOranges= 5;
int numApples= 10;
int numFruit;
numFruit= numOranges++ + numApples;
numFruit je dobio vrednost 15
numOranges je dobio vrednost 6

SI1P1 2004 51/15 SI1P1 2004 52/15

13
Primer relacionalnih operatora Kondicionalni operatori

int x= 3; Kondicional operatori se jo nazivaju i boolean


int y= 5; (logiki) operatori, jer koriste samo izraze koje
boolean result; imaju vrednosti true ili false.
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 SI1P1 2004 54/15

Tabela istinitosti 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);

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

SI1P1 2004 55/15 SI1P1 2004 56/15

14
Korienje && i || Korienje && i ||

Java izvrava skraeno izraunavanje: to znai da (a && (b++ > 3));


pri izraunavanju && i || izraza sa leve ka desnoj ta se deava ako je a false?
strani, im se pronae rezultat prestaje se sa daljim Java nee ni izraunavati izraz (b++ > 3), ako je
izraunavanjem. levi operand false, jer je rezultat automatski false.
Primer: To dovodi do toga da se vrednost b nee
(a && (b++ > 3)) inkrementirati
(x || y) (x || y);
Java e izraunati ta se deava ako je x true?
a pre (b++ > 3) Slino, nee se izraunati vrednost desnog
x pre y operanda, jer je rezultat sigurno true.

SI1P1 2004 57/15 SI1P1 2004 58/15

Primer Operatori

Sve o Java operatorima


1) Kolika je vrednost promenljive number? http://java.sun.com/docs/books/tutorial/java/nutsandbolts/
int number= 5 * 3 3 / 6 9 * 3; opsummary.html
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 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 SI1P1 2004 62/15

Tipovi podataka Tipovi podataka

SI1P1 2004 63/15 SI1P1 2004 64/15

16
Uvod

ta su kontrolne strukture
Tipovi kontrolnih struktura:
Blok
Izrazi odluivanja
Uvod u programiranje 1 Java Petlje
Kontrole toka

SI1P1 2004 65/15 SI1P1 2004 66/15

ta su kontrolne strukture if struktura

Bez kontrolnih struktura, raunar bi izvravao if klauzula doprinosi uslovnom izvravanju


instrukcije iz programa korak-po-korak programa
Kontrolne strukture omoguavaju promenu: if (expression) {
redosled po kome e se instrukcije izvravati statement;
koje instrukcije e se izvravati }
kontrola toka samog programa next_statement;
Kontrolne strukture ukljuuju: Izraz expression mora biti logikog tipa i njegova
blokovske izraze (sve to se nalazi unutar vrednost mora biti true ili false
velikih zagrada) Ako je vrednost izraza expression true, izvravaju
izraze odluivanja se izrazi statement, pa nakon njih next_statement
petlje Ako je vrednost izraza expression false, izrazi
statement se nee izvriti i program e nastaviti sa
SI1P1 2004 67/15
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 69/15
statement2, pa nakon njih next_statement.
SI1P1 2004 70/15

if-else struktura 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 SI1P1 2004 74/15

switch struktura 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

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 77/15 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){ Ako se u uslovu inicijalizacije i inkrementa
System.out.println(div+je deljivo sa 12"); 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);
U okviru izvravanja ovog primera e se prikazati
svaki broj od 0 do 999 koji je deljiv sa 12. }
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 81/15 }
SI1P1 2004 82/15

while petlja 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 SI1P1 2004 86/15

Petlja unuta petlje Pitanja 1

Mogue je unutar bilo koje vrste petlje ubaciti bilo U okviru programa realizuje se i opcija za podizanje
koju vrstu petlje 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 87/15 SI1P1 2004 88/15

22
Pitanja 2 Pitanja 3

Kako se moe implementirati funkcija ta je rezultat izvravanja sledee petlje?


AbsoluteValue, funkcija koja kao rezultat vraa
pozitivnu vrednost unetog broja for (int i=100; i>=0; i--) {
Bolje je koristiti if strukturu nego switch. System.out.println(i);
}

Brojevi od 100 do 0.

SI1P1 2004 89/15 SI1P1 2004 90/15

ta su nizovi

Niz je serija odeljaka koji slue za smetanje


podataka.
To je u stvari blok promenljivih.
U Javi, nizovi mogu da obuhvate samo jedan tip
Uvod u programiranje 1 Java podataka.
Nizovi na
nain organizovanja podataka Na primer niz moe obuhvatiti samo lanove koji su
celobrojni borjevi ili samo lanove koji su stringovi

SI1P1 2004 91/15 SI1P1 2004 92/15

23
Nizovi Deklarisanje nizova

Nizove definie tip, ime i veliina. Deklaracija nizova je slina deklaraciji obinih
Niz od tri celobrojne veliine koji se zove prices: promenljivih, samo to se koriste srednje zagrade [
].
tipPodataka[] imeNiza;
Niz od tri string veliine koji se zove people
int[] prices;
String[] people;
Na drugi nain deklarisanje je mogue:
Pojedinana vrednost u okviru niza je element niza.
Pozicija svakog elementa u okviru niza je njegov tipPodataka imeNiza[];
indeks.
int prices[];
SI1P1 2004 93/15 SI1P1 2004 94/15

Rezervisanje prostora Indeksi

Za razliku od obinih promenljivih pri korienju Pojedinanom elementu niza se pristupa pomou
nizova, potrebno je rezervisati eljenimemorijski njegovog indeksa.
prostor. (U jeziku C postoji naredba malloc()) U Javi indeksi kreu od broja 0 i poslednji ima
Koristi se kljuna re new da bi se rezervisala indeks n-1, gde je n veliina niza.
memorija: Na primer niz prices ima veliinu 3, i njegovi
imeNiza = new tipPodataka[veliina]; elementi imaju indekse 0, 1, i 2.
uvati se Array out of Bounds greaka.
prices = new int[3]; imeNiza[indeks]
people = new String[4]; Sa elementima niza se moe postpuati kao sa
Prvi primer rezervie prostor za niz celih brojeva obinim promenljivima
veliine 20, a drugi primer niz Stringova veliine 10. prices[0] = 6;
Moe se kombinovati deklaracija sa rezervisanjem prices[1] = 80;
int[] prices=new int[3];
SI1P1 2004 95/15
prices[2] = 10;
SI1P1 2004 96/15

24
Korienje nizova Inicijalizacija nizova

Elementima niza Stringova se pristupa na identian Mogu se definisati i svi elementi niza, pri njegovom
nain: deklarisanju.
Tada se koristi velika zagrada da bi se odvojili
String[] people; elementi niza od ostatka koda i zarez da bi se
people = new String[4]; odvojili pojedinani elementi.
people[0] = Lana;
people[1] = Pera; String[] people= {Lana,Pera, Mika, Maja};
people[2] = Mika; int[] prices = {6, 80, 10};
people[3] = Maja; Svi elemnti niza i ovom sluaju moraju biti istog
tipa.

SI1P1 2004 97/15 SI1P1 2004 98/15

Korieni pojmovi Pitanja

Rezervisanje prostora kreiranje prznaog Koje od sledeih naredbi ne kreiraju niz


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 99/15 SI1P1 2004 100/15

25
Duina niza Primer

Svaki niz ima svoju osobinu kojoj se moe pristupiti


po imenu length Primer koda:
Pristup ovoj osobini se odvija na sledei nain: String[] names = {Lana,Pera, Mika, Maja};
imeNiza.length; for(int i=0; i<names.length; i++)
System.out.println(names[i]+!");
String[] people = {Lana,Pera, Mika, Maja};
Rezultat:
int numPeople = people.length;
Lana!
Vrednost promenljive numPeople je 4.
Pera!
Nizovi su uvek iste duine. Njihova duina se ne Mika!
moe menjati od trenutka kada su kreirani.
Maja!

SI1P1 2004 101/15 SI1P1 2004 102/15

Primer 2 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 class BubbleSort {


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

Dvodimenzionalni nizovi Dvodimenzionalni nizovi

Nizovi koji su do sada razmatrani mogu se Primer: Karta zemljita je podeljena na mreu 20 x
posmatrati kao jedan red vrednosti 55 razliitih imanja. U svakom polju treba upisati
Dvodimenzionalni niz se moe posmatrati kao povrinu odreenog imanja.
mrea (ili matrica) vrednosti. Prvo je potrebno deklarisati dvodimenzionalni niz:
Svakom elementu dvodimenzionalnog niza se moe
pristupiti pomou dva indeksa: redni broj reda i double[][] heights;
redni broj kolone. heights= new double[20][55];
Dvodimenzionalni niz je u sutini niz iji je svaki Ovaj dvodimenzionalni niz ima 20 redova i 55
element novi niz kolona
Da bi se pristupilo pojedinanom imanju koje se
nalazi u 11-om redu i 23-oj koloni:
heights[11][23]
SI1P1 2004 107/15 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}; Uvod u programiranje 1 Java
a[0]= b; a[1] = c; a[2] = d; Metodi

Mogu se definisati i viedimenzionalni nizovi:

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

SI1P1 2004 109/15 SI1P1 2004 110/15

Sadraj lekcije Koncept metoda

ta je metod Metodi se jo nazivaju i funkcije ili procedure.


Zato koristimo metode Metod je nain da se odreeni broj koraka integrie
Kako da deklariemo metode u poseban deo koda i na taj nain posebno poziva i
etiri dela metoda obrauje.
Kako pozvati metod Kada bi sve mogli da se koriste metodi?
Svrha metoda main izraunavanje kvadratne formule, prikaz na
ekranu, ...
Neki primeri metoda

SI1P1 2004 111/15 SI1P1 2004 112/15

28
Koncept metoda Izraunavanje kvadratnog korena

Metodi mogu da prihvate ulazne podatke u formi Kvadratni koren je dobar primer upotrebe metoda.
argumenata Metod koji slui za dobijanje kvadratnog korena
Nakon toga mogu da izvre odreene operacije sa prihvata broj kao argument i kao rezultat vraa
argumentima kvadratni koren od tog broja.
Na kraju mogu da vrate vrednost koju su dobili kao
rezultat izraunavanja, t.j. da generiu izlaz

SI1P1 2004 113/15 SI1P1 2004 114/15

Izraunavanje kvadratnog korena Deklarisanje metoda

Izraunavanje kvadratnog korena obuhvata i vie Metod ima 4 dela: tip rezultata, ime, argumente, i
meukoraka izmeu operacija prihvatanja ulaznog telo metoda
podatka i generisanja izlaza. Tip, ime i argumenti, zajedno, se jo nazivaju i
Kada se koristi ovaj metod, korisnika ne interesuju potpis metoda
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
apstrakcija

SI1P1 2004 115/15 SI1P1 2004 116/15

29
Tip rezultata metoda Generisanje rezultata

Tip rezultata metoda moe biti bilo kog tipa U okviru metoda se koristi naredba return da bi se
podataka. definisao rezultat izvravanja operacije metoda.
Tip metoda se odreuje na osnovu tipa podataka Njegova forma je:
koji se generie kao izlaz. return vrednost_izvravanja;
Metod moe i da ne vraa rezultat, u kom sluaju se Tip promenljive vrednost_izvravanja mora da
deklarie kao tipa void. 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 117/15 SI1P1 2004 118/15

Generisanje rezultata void metod

Metod se zavrava odmah nakon izvravanja Metod tipa void ima return naredbu bez definisane
naredbe return specifine vrednosti
Zato je u veini sluajeva return naredba poslednja return;
naredba u okviru metoda
Na prvi pogled se ini da je ovaj pristup beskoristan,
Metod moe imati i vie return naredbi.
ali se u praksi void esto koristi.
int absoluteValue(int num){ Dobar primer je metod kada je potrebno samo neto
if (num < 0) prikazati na ekranu.
return num; Kao se u okviru metoda tipa void ne navede naredba
else return, podrazumeva se da se ona izvrava na kraju
metoda
return num;
}

SI1P1 2004 119/15 SI1P1 2004 120/15

30
Argumenti metoda Argumenti metoda

Metodi mogu dobijati ulazne podatke u formi Vie argumenata metoda se odvajaju zarezom:
argumenata. double pow(double x, double y)
Argumenti se koriste kao promenljive u okviru tela
metoda. Argumenti mogu biti razliitog tipa
Kao promenljive, i argumentima se mora int indexOf(String str, int fromIndex)
specificirati tip. Telo metoda je blok specificiran sa velikim
Argumenti se definiu unutar zagrada koje se nalaze zagradama, { }. U okviru tela metoda se definiu
iza imena metoda. akcije metoda.
Argumenti metoda se mogu koristiti bilo gde u
double podeli(double a, double b) { okviru metoda.
double odgovor; Svi metodi moraju imati velike zagrade bez obzira
odgovor = a / b; da li se telo metoda sastoji od jedne naredbe ili ak
return odgovor; od nijedne.
}
SI1P1 2004 121/15 SI1P1 2004 122/15

Poziv metoda main metod

Da bi se pozvao odreeni metod, potrebno je Do sada smo koristili jedino metod main
specificirati ime metoda, iza koga treba navesti listu Ovaj metod je taka odakle uvek poinje
argumenata odvojenih zarezom i u okviru zagrada
izvravanje Java programa
main metod je static i ima strog format koji se mora
pow(2, 10); //rauna 2 na 10
potovati:
public static void main(String[] args) {
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;
}
SI1P1 2004 123/15 SI1P1 2004 124/15

31
main metod Primer

class SayHi{
public static void main(String[] args) { ta nije u redu u sledeem delu programa
System.out.println("Hi, " + args[0]);
} static double addSometimes(num1, num2){
} double sum;
Ako se otkuca java Program arg1 arg2 argN u if (num1 < num2){
okviru komandne linije, sve nakon imena klase se sum = num1 + num2;
automatski uitava u niz pod imenom args: String completed = completed;
java SayHi Bosko return completed;
U ovom primeru lan args[0] e sadravati String }
Bosko", i izlaz proma e biti "Hi, Bosko"
}

SI1P1 2004 125/15 SI1P1 2004 126/15

Primer Primer

class Greetings { class Max {


public static void main(String args[]) { public static void main(String args[]) {
String greeting = ""; if (args.length == 0) return;
for (int i=0; i < args.length; i++) { int max = Integer.parseInt(args[0]);
greeting += "Jambo " + args[i] + "! "; for (int i=1; i < args.length; i++) {
} if (Integer.parseInt(args[i]) > max) {
System.out.println(greeting); max = Integer.parseInt(args[i]);
} }
} }
Nakon kompaliranja i pokretanja System.out.println(max);
java Greetings Lana Pera Maja }
izlaz e biti "Jambo Lana! Jambo Pera! Jambo }
Maja!" java Max 3 2 9 2 4 dobija se izlaz 9
SI1P1 2004 127/15 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 Uvod u programiranje 1 Java
primitivni tip podataka (na primer int) ili sloeni (na
Objekti i klase
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 SI1P1 2004 130/15

Do sada smo nauili ta moe biti problem

Tipove podataka: int, double, boolean, String Neki podaci se pamte zajedno.
Promenljive: Pamte vrednost odreenog tipa. String[] imena
Nizovi: Pamte vie vrednost odreenog tipa. int[] ocene
Kontrolne strukture: If-then, For petlje ... Metodi poinju da se komplikuju.
Metodi: Delovi koda kojima moemo proslediti Metodi mogu vratiti rezultat samo jednog tipa.
argumente i izvriti ih. Programeri ne ele da razmiljaju o svim
Da li je to sve to nam je potrebno? neprikazanim tipovima.

SI1P1 2004 131/15 SI1P1 2004 132/15

33
Apstrakcija ta je objekat

Objekti su alati za primenu apstrakcije. Objekat ima dva dela:


Pokuavamo apstraktovati odreene detalje da bi se Stanje: Osobine objekta.
suoili sa kompleksnim problemima. Ponaanje: Stvari koje objekat moe da uradi.
Apstrakcija je fundamentalni koncept u raunarskim Primer automobila:
naukama. Stanje: Boja, vrsta motora, automatik
Problem je i da se ne primenjuje suvie apstrakcije. Ponaanje: koiti, ubrzati, svirati, voziti u
Umee je znati oje detalje treba sakriti, a koje treba odreenom smeru
prikazati. Primer oovek:
Stanje: Teina, visina, pol, godite
Ponaanje: Jesti, spavati, vebati, uiti

SI1P1 2004 133/15 SI1P1 2004 134/15

ta je objekat Zato koristiti objekte

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 135/15 SI1P1 2004 136/15

34
Klase Klase

Klasa je uzorak ili kalup pomou koga se stvara Osnovna anatomija klase
objekat
Svaka klasa moe sadrati: public class imeKlase{
- lanove podataka (osobine/karakteristike lanove podataka
objekta/klase) Konstruktori
- Metode (definiu ponaanje objekata dobijenoh od Metodi
klase)
}
- Konstruktore (specijalne metode)

SI1P1 2004 137/15 SI1P1 2004 138/15

Prva klasa: prekidacZaSvetlo 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{ class prekidacZaSvetlo{


boolean upaljeno = true; boolean upaljeno = true;
} void pritisni() {
Koje stanje prekidacZaSvetlo moe imati? this.upaljeno = !this.upaljeno ;
Stanje se pamti u okviru polja, ovde je to upaljeno }
Poljima se prilazi na sledei nain: }
imePromenljive.imePolja Re this se odnosi na pojedinani objekat
Kasnije e biti rei o drugim vrstama polja Pomou this.upaljeno se pristupa polju upaljeno.
Koje ponaanje prekidacZaSvetlo moe imati? Koje ponaanje prekidacZaSvetlo sada moe imati?

SI1P1 2004 141/15 SI1P1 2004 142/15

Korienje objekata Konstruktori

public static void main(String[] args) { Konstruktori povezuju objekte sa podacima koji su
prekidacZaSvetlo s = new prekidacZaSvetlo(); im potrebni da bi se inicijalizovali
System.out.println(s.upaljeno); Objekti imaju default konstruktor koji nema nijedan
s.pritisni(); argument, kao prekidacZaSvetlo().
System.out.println(s.upaljeno); Mogu se definisati sopstveni konstruktori koji mogu
imati proizvoljan broj argumenata.
}
Konstruktori nemaju tip povratka i moraju imati isto
Pomou new se kreira novi objekat.
ime kao klasa:
Iza new mora se navesti konstruktor.
ImeKlase(definisanje argumenata) {
Metodi se pozivaju na sledei nain:
telo konstruktora
imePromenljive.imeMetoda(argumenti)
}
ta se dobija kao izlaz ovog programa?

SI1P1 2004 143/15 SI1P1 2004 144/15

36
Konstruktori Konstruktori

class prekidacZaSvetlo { prekidacZaSvetlo() {


boolean upaljeno ; prekidacZaSvetlo(true) ;
void pritisni() { }
this.upaljeno = !this.upaljeno ; prekidacZaSvetlo (boolean pocetnoStanje) {
} this.upaljeno = pocetnoStanje;
prekidacZaSvetlo (boolean pocetnoStanje) { }
this.upaljeno = pocetnoStanje; }
} Moe se definisati vie konstruktora.
} Konstruktori se mogu meusobno pozivati.
Konstruktor prekidacZaSvetlo() vie ne postoji.
Kako se sada pravi instanca objekta?

SI1P1 2004 145/15 SI1P1 2004 146/15

prekidacZaSvetlo prekidacZaSvetlo - druga verzija

class prekidacZaSvetlo{ class prekidacZaSvetlo{


boolean upaljeno = true; int upaljeno = 1;
boolean daLiJeUpaljeno() { boolean daLiJeUpaljeno() {
return upaljeno; return upaljeno == 1;
} }
void pritisni() { void pritisni() {
upaljeno = !upaljeno; upaljeno = 1 - upaljeno;
} }
} }

SI1P1 2004 147/15 SI1P1 2004 148/15

37
Apstrakcija Problem apstrakcije

Obe prethodne verzije se imaju isto ponaanje. Korisnik klase prekidacZaSvetlo koji pristupa
Klasu prekidacZaSvetlo treba tretirati kao logikoj promenljivoj upaljeno, grei ako se ova
apstrakciju: ne interesuje nas unutranjikod, ve promenljiva promeni u celobrojnu
samo njeno ponaanje class PrimerGreske{
Interni kod = implementacija
public static void main(String[] args) {
Spoljanje ponaanje = interfejs
prekidacZaSvetlo ls= new prekidacZaSvetlo ();
Pisanje koda i poboljanje implementacije se moe
ovbavljati sve dok je interfejs isti if (ls.upaljeno) // greska!
Sve dok je korisnjenje objekta date klase isto, ne System.out.println("upaljeno!");
zanima nas kako je dobijeno dato ponaanje. else
U velikim projektima, gde ima vie timova, System.out.println(Nije upaljeno!");
programera jedino zanima njegov deo koda (na
primer Microsoft, Google, Goldman Sachs, Morgan }
Stanley i finansijske kompanije) }
SI1P1 2004 149/15 SI1P1 2004 150/15

public i private pristupi Poboljana verzija klase prekidacZaSvetlo

Ako se polja ili metodi oznae kao private, tada im class prekidacZaSvetlo{
druge klase ne mogu pristupiti private boolean upaljeno = true;
Ako se polja ili metodi oznae kao public, tada im public boolean daLiJeUpaljeno() {
bilo koja druga klasa moe pristupiti
return upaljeno;
Ako se ne specificira posebno da li je polje ili metod
}
public ili private, tada se podrazumeva da je public.
void pritisni() {
upaljeno = !upaljeno;
}
}

SI1P1 2004 151/15 SI1P1 2004 152/15

38
Novi problemi Promenljive i objekti

U prethodnom primeru polje upaljeno je definisano Postoje dve vrste podataka u Javi: promenljive i
kao private objekti
class prekidacZaSvetlo{ Promenljive: byte, short, int, long, double, float,
private boolean upaljeno = true; boolean, char
== proverava da li dve promenljive imaju istu
vrednost
Ako se iz druge klase pristupa ovom polju desie se
greka pri kompajliranju Objekti: definisani u okviru Java klasa
== proverava da li su dva objekta isti objekat
if (ls.upaljeno) // greska

SI1P1 2004 153/15 SI1P1 2004 154/15

Reference Reference

Pomou new se uvek stvara nova jedinstvena g != h se dobija, jer g i h predstavljaju reference na
instanca klase razliite objekte
Kada se instanca povee sa odreenom Covek g = new Covek(Lana", 3);
promenljivom, tada promenljiva sadri referencu ili Covek h = new Covek(Lana", 3);
vezu sa datim objektom
Covek g = new Covek(Lana", 3);
g h
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
Lana Lana
3 3
SI1P1 2004 155/15 SI1P1 2004 156/15

39
Reference Pitanja

maja1 == maja2 se dobija, jer maja1 i maja2 Da li je (a == b)?


predstavljaju referencu na isti objekat int a = 7;
Covek maja1 = new Covek(Maja", 34); int b = 7;
Covek maja1 = maja2; Odgovor: Da
Da li je (g == h)?
maja1 maja2 Person g = new Person(Mwangi", 21);
Person h = new Person(Mwangi", 21);
Odgovor: Ne

Maja
34
SI1P1 2004 157/15 SI1P1 2004 158/15

Pitanja Primer BankAccount

true ili false? class BankAccount{


double balance;
Person g = new Person(James", 22); String name;
Person h = new Person("James", 22); BankAccount(String name, doubleopenBalance){
this.name = name;
Person lucy1 = new Person(Lucy", 19); this.balance = openBalance;
Person lucy2 = lucy1; }
double deposit(double amount) {
balance += amount;
a) g == h return balance;
b) g.getAge() == h.getAge() }
boolean withdraw(double amount) {
c) lucy1 == lucy2 if (amount < balance){
d) lucy1.getAge() == lucy2.getAge(); balance -= amount;
return true;
} else return false;
}
SI1P1 2004 159/15
} 2004
SI1P1 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 Uvod u programiranje 1 Java
bilo koje sloene Java aplikacije Static & Final

SI1P1 2004 161/15 SI1P1 2004 162/15

Primer Analiza

public class MyMath{ U prethodnom primeru, da bi se dobio kvadrat broja


public double PI = 3.14159; 5 potrebno je kreirati instancu klase MyMath:
public double square (double x) {
return x * x; MyMath m = new MyMath();
} Tada se poziva metod square() sa argumentom 5:
public static void main(String[ ] args) { m.square(5);
MyMath m = new MyMath();
System.out.println("m: value of PI is " + m.PI);
Rezultat poziva metoda square() sa instancama m i
System.out.println("m: square of 5 is " + m.square(5)); n je isti:
MyMath n = new MyMath(); m: value of PI is 3.14159
System.out.println("n: value of PI is " + n.PI); m: square of 5 is 25
System.out.println("n: square of 5 is " + n.square(5));
}
n: value of PI is 3.14159
} n: square of 5 is 25
Metod square() se ponaa isto bez obzira koja ga
SI1P1 2004 163/15 instanca poziva
SI1P1 2004 164/15

41
Analiza MyMath - ponovo

Vrednost promenljive PI = 3.14159 je ista za sve public class MyMath{


instance klase MyMath. // add keyword "static" to field declaration
public static double PI = 3.14159;
Zato je potrebno smestiti vrednost PI nezavisno za // add keyword "static" to method declaration
svaku instancu klase MyMath? public static double square (double x) {
Da li je mogue smestiti jednu vrednost promenljive return x * x;
PI za celu klasu MyMath? }
// 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));
}
SI1P1 2004 165/15
}
SI1P1 2004 166/15

static PI final

U prethodnom primeru je dodata re static kod Promenljiva PI je deklarisana sa


deklaracije konstante PI: public static double PI = 3.14159;
public staticdouble PI = 3.14159; I na ovaj nain je mogue promeniti njenu
Na taj nain je definisano da postoji samojedna vrednost:
vrednost promenljive PI za sve instance klase MyMath.PI= 999999999;
MyMathclass Da bi se definisala kao konstanta potrebno je
PI je sada podatak koji pripada klasi 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 167/15 SI1P1 2004 168/15

42
final MyMath nova verzija

Jo jedan primer upotrebe final public class MyMath{


public static final Point ORIGIN =new Point(0,0); // add keyword finalto field declaration
Time smo zabranili promenu vrednosti promenljive public static finaldouble PI = 3.14159;
na sledei nain: public static double square (double x) {
MyMath.ORIGIN= new Point(3, 4); return x * x;
ALI! I dalje se mogu pozivati metodi koji na nenki }
nain mogu promeniti stanje promenljive ORIGIN: public static void main( String[ ] args) {
MyMath.ORIGIN.setX(4); System.out.println("Valueof PI is " +
MyMath.PI);
System.out.println("Squareof 5: " +
MyMath.square(5));
}
}
SI1P1 2004 169/15 SI1P1 2004 170/15

static metod static metod

U primeru je dodata re "static" i pred deklaracije Statiki metodi ne vre operacije da specifinim
metoda square(): instancama njihovih klasa
public static double square(doublex) { Ovi metodi imaju pristup samo statikim poljima i
return x * x; metodama klase
} Ne mogu pristupiti nijednom elemntu koji je ne-
Sada je metod square() podeljen izmeu svih statiki
instanci ove klase postoji samo jedan square Metodi klase" je bolja definicija
metod za celu klasu, ne jedan za svaku instancu Suprotni termin je metodi instance"

SI1P1 2004 171/15 SI1P1 2004 172/15

43
Math klasa Primeri static polja

Detaljniji pregled klase Math u okviru Javinog API Konstante koje se koriste u okviru klasa (uobiajeno
Ne moe se kreirati instanca klase Math, ona slui je da su deklarisane pomou final)
za smetanje korisnih static metoda Potrebna je samo jedna po klasi, nije potrebna po
Svi metodi i polja su static: jedna u svakom objektu
Math.sqrt(16) Sledea deklaracija:
Math.PI public static final double TEMP_CONVERT= 1.8;
Math.abs(-3) 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, ...
SI1P1 2004 173/15 SI1P1 2004 174/15

Primeri static metoda Pitanja

Za metode koji koriste samo argumente i na taj Da li sledei podaci treba da budu static ili ne-
nain ne koriste instance static?
public static double pow(double b, double p) Podatak koji definie brzinu svetlosti
// Math class, getName() metod u okviru klase Person
Za metode kojima trebaju samo static podaci zbir() metod koji kao rezultat vraa zbir dva svoja
Takoe, koristi se i kod main metoda kod klase argumenta
pomou koje se startuje program Podatak koji definie irinu u okviru Rectangle klase
U trenutku startovanja programa ne postoji objekti static
koje bi main metod mogao da koristi non
static
non

SI1P1 2004 175/15 SI1P1 2004 176/15

44
Pristup i organizacija

Na raunaru postoji hiljade fajlova.


Na Internetu postoji vie miliona sajtova.
Projekat moe imati hiljade klasa.
Uvod u programiranje 1 Java Kako pronai odreenu klasu, fajl ili sajt?
Organizacija
Organizacija podataka i kontrola pristupa Kako organizujemo rad u sluaju istih ili
slinih imena?
Kako se moe ograniiti pristup privatnim
podacima?

SI1P1 2004 177/15 SI1P1 2004 178/15

U ovoj lekciji Oblast vaenja

Oblast vaenja: Odakle moemo pristupiti Oblast vaenja promenljive, polja, metode ili klase
pojedinanim podacima. je deo programa iz koga se moe pristupiti ovim
Kako se koriste Java paketi. elementima.
Kako se kreiraju Java paketi. 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 179/15 SI1P1 2004 180/15

45
Anonimne promenljive Primer oblasti vaenja promenljive

Anonimne promenljive se deifiniu i 0 void foo(int x) {


inicijalizuju, ali se nikada ne deklariu. 1 int y = 3;
U jezicima C i C++ anonimne promenljive se 2 if (y > 0) {
tretiraju kao greka, u Javi ne. 3 int z= 4;
Ove promenljive nemaju ime i ne mogu se 4 if (z> 0) {
pozivati pa nemaju oblast vaenja. 5 int w= 0;
6 {
Primeri:
7 int v = 1;
System.out.println(Hello); 8 } // end block
(new String(Hello)) 9 } // end if (z>0)
(new int[] {1,2,3,4}) 10 } // end if (y>0)
(Poslednji primer sadri elemente koji e se 11 } // end
razmatrati kasnije) Iz kojih linija koda se moe pristupiti
SI1P1 2004 181/15
promenljivama v, w, x, y, i z?
SI1P1 2004 182/15

Primer oblasti vaenja metoda Primer oblasti vaenja polja

class TestScope { class Scope{


int x = 0; int x = 3;
void foo(int z) {
void foo(int y) {
int y = 20;
x = 10; System.out.println(x);
int z = 30; // Error int x = 2;
}// end foo() System.out.println(x);
void print() { System.out.println(this.x);
System.out.println(x);
System.out.println(y);
foo(x);
System.out.println(x); }
/* Next line error */ public static void main(String[] args) {
System.out.println(y); int x = 1;
}// end print() (new Scope()).foo(x); // AnonymousObject
}// end TestScope
}
x je definisano za celu klasu
y je definisano u okviru metoda f(int). }
SI1P1 z je ve definisan u f(int) jer je argument metoda.
2004 183/15 SI1P1 ta je rezultat izvravanja programa?
2004 184/15

46
Primer oblasti vaenja i petlje Pitanje

int sigma(int n) { class TestScope {


int x = 0;
for (int i = 0; i<n; i++) { void foo() {
int sum += i; int y = 20;
x = 10;
} }// end foo
return sum; void print() {
int y = 0;
} System.out.println(x);
Metod sigma bi trebalo da generie rezultat koji je foo();
jednak System.out.println(x);
System.out.println(y);
}// end print()
Zato se javlja greka pri kompajliranju? }// end Class TestScope
ta se dobija na izlazu kao rezultat izvravanja programa?
0
10
SI1P1 2004 185/15
0
SI1P1 2004 186/15

Pitanje 2 Pitanje 3

class TestScope { class TestScope {


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

47
Imenovanje promenljivih u velikim projektima Hijerarhijska organizacija

Veliki projekti mogu imati na hiljade klasa. Imena su organizovana u hijerarhijski raspored.
Moete saraivati i deliti klase sa ljudima koji se Bill Gates: Porodica: Gates, lan: Bill.
nalaze irom sveta. rti.etf.bg.ac.yu
Kako da budete sigurni da se ime vae klase nee 254-020-5555555: Kenya (254), Nairobi (020), Broj
poklopiti sa nekim imenom neke druge? 5555555
Moete koristiti dugaka jedinstvena imena.. java.lang.String: String je klasa, u okviru lang
UtilityClassForPreparingTaxReturnsByAnthonyGfrom paketa, koji se nalazi u okviru osnovnog java
WestlandsNairobiKenya paketa.
Ovakav nain je teak za pamenje i korienje.

SI1P1 2004 189/15 SI1P1 2004 190/15

Definicija paketa Paketi

Potrebno je organizovati klase u skupove ili delove Deklaracija paketa mora biti prva linija u fajlu koja
programa koji se nazivaju paketi. nije komentar.
Na ovaj nain se smanjuje problem konflikta imena i Prva klasa definisan au okviru fajla mora da ima isto
prepoznavanja funkcionalnosti, na primer java.util. ime kao i ime fajla.
Moe se ograniiti pristup na nivou paketa. Samo prva klasa moe biti tipa public.
Pripadnost klase paketu se definie sa: javac i java e traiti navedene poddirektorijume ili
package imePaketa; JAR (Java Archive) fajlove za navedeni kod:
class imeKlase{ putanja \mypkg\util za paket mypkg.util (na
/* Telo klase */ Windows operativnom sistemu)
} putanja /mypkg/util/arrays za paket
mypkg.util.arrays (na Unix operativnom sistemu)

SI1P1 2004 191/15 SI1P1 2004 192/15

48
Korienje paketa Specifikatori pristupa

Mogu se korisno definisati imena: Polja, metode, konstruktori i klase koje su


java.util.Date d = new java.util.Date(); definisane kao public omoguavaju pristup iz bilo
Ili specifirati klase koje se ele koristiti: koje klase bilo kog paketa.
import java.util.Date; Polja, metode, konstruktori i klase koje su
definisane kao protected omoguavaju pristup samo
import java.util.ArrayList; klasama koje ih nasleuju.
Mogu se koristiti sve klase iz paketa: Polja, metode, konstruktori i klase koje su
import java.util.*; definisane sa paketnim pristupom omoguavaju
Paketi mogu imati pod-pakete: pristup iz bilo koje klase istog paketa. Ovakav
import java.util.logging.*; pristup se podrazumeva.
Default korieni paket: Polja, metode i konstruktori koji su definisani kao
import java.lang.*; private omoguavaju pristup samo kodi iz klase u
kojoj se pojavljuju.
SI1P1 2004 193/15 SI1P1 2004 194/15

Nivoi kontrole pristupa 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; package examples;


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

SI1P1 2004 197/15 SI1P1 2004 198/15

Primer Primer

package examples; package examples;


import java.util.Date; import java.util.*;
import java.util.ArrayList; class Person {
class Person {
String name;
String name;
ArrayList friends;
ArrayList friends;
Date birthDay;
Date birthDay;
void setBirthday(Date d) { void setBirthday(Date d) {
this.birthDay = d; this.birthDay = d;
} }
Date getBirthday() { Date getBirthday() {
return this.birthDay; return this.birthDay;
} }
} }
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
Uvod u programiranje 1 Java osobina nasleujemo od naih roditelja.
Nasleivanje 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).

SI1P1 2004 201/15 SI1P1 2004 202/15

Klasa Masai Klasa Kikuyu

public class Masai{ public class Kikuyu {


private String name; private String name;
private int cows; private int money;
public Kikuyu(String n, int m) {
public Masai(String n, int c) {
name = n;
name = n;
money = m;
cows = c;
}
} public String getName() { return name; }
public String getName() { return name; } public int getMoney() { return money; }
public int getCows() { return cows; } public void speak() {
public void speak() { System.out.println(Kikuyu");
System.out.println(Masai"); }
} }
}
SI1P1 2004 203/15 SI1P1 2004 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 206/15

Kenyan superklasa Masai podklasa

public class Kenyan { public class Masai extends Kenyan{


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

SI1P1 2004 207/15 SI1P1 2004 208/15

52
Kikuyu podklasa Pitanje

public class Kikuyu extends Kenyan{ ta se dobija na izlazu?


private int money;
public Kikuyu(String n, int m) { Masaid = new Masai(Johnson" 23);
super(n); // poziv Kenyan konstruktor Kikuyu c = new Kikuyu(Sheila", 2200);
money = m; System.out.println(d.getName() + " has " +
}
public int getMoney() { d.getCows() + " cows");
return money; System.out.println(c.getName() + " has " +
}
c.getMoney() + " shillings");
public void speak() {
System.out.println(Kikuyu"); Johnson has 23 cows
} Sheila has 2200 shillings
}

SI1P1 2004 209/15 SI1P1 2004 210/15

Pravila nasleivanja Konstruktor podklase

Koristi se slubena re extends da bi se Prva stvar koju konstruktor podklase


naznailo koja klasa nasleuje koju mora da uradi je da pozove
klasu konstruktor superklase
Podklasa nasleuje sva polja i sve Na ovaj nain se delovi koji pripadaju
super klasi konstruiu pre delova koji
metode superklase su deo same podklase
Koristi se slubena re super u okviru Ako se ne pozove konstruktor
konstruktora podklasem da bi se superklase pomou naredbe super i
pozvao kontruktor superklase superklasa ima konstruktor bez
argumenata, tada e se taj konstuktor
pozati implicitno.
SI1P1 2004 211/15 SI1P1 2004 212/15

53
Primer Pitanje

Ako je data klasa Food: Je ekvivalentno sa: public class A {


public class Food { public class Beef extends Food public A() { System.out.println("I'm A"); }
private boolean raw; { }
public Food() { private double weight; public class B extends A {
public B() { System.out.println("I'mB"); }
raw = true; public Beef(double w) {
}
} super();
public class C extends B {
} weight = w public C() { System.out.println("I'mC"); }
I podklasa Beef: } }
public class Beef extends Food } ta e se pojaviti na ekranu nakon sledee naredbe?
{ C x = new C();
private double weight;
public Beef(double w ) { I'm A
weight = w I'm B
} I'm C
} 2004
SI1P1 213/15 SI1P1 2004 214/15

Preklapanje metoda 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 Konverzija tipova

SI1P1 2004 217/15 SI1P1 2004 218/15

Primer 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 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 { class Manager extends Employee {


private double wage;
private double salary;
private double hoursWorked;
public Engineer(String fName, String lName, double public Manager(String fName, String lName,
rate, double hours){ double sal){
super(fName, lName); super(fName, lName);
wage = rate;
hoursWorked= hours;
salary = sal; }
} public double getPay() {
public double getPay() { return salary; }
return wage * hoursWorked;}
public void printData() {super.printData();
public void printData() {
super.printData(); System.out.println("Monthly salary: $" +
// PRINT NAME
SI1P1 2004 223/15 salary);}}
SI1P1 2004 224/15

System.out.println("Weeklypay: $" + getPay(); }}

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 226/15

Primer Klasa Object

public class PayRoll{ Sve Javine klase implicitno nasleuju klasu


public static void main(String[] args) { java.lang.Object
fred= new Engineer("Fred", "Smith", 12.0, 8.0); Tako da svaka klasa koja se napie automatski ima
Manager ann= new Manager("Ann", "Brown", neke metode koji pripadaju klasi Object, kao o su
1500.0); equals, hashCode, i toString.
SalesManager mary= new SalesManager("Mary", Neki od ovih metoda e se obraivati u kasnijim
"Kate", 2000.0); lekcijama
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 SI1P1 2004 228/15

57
U ovoj lekciji

ta predstavlja izuzetak
Uobiajena terminologija
Zato koristiti izuzetke
Uvod u programiranje 1 Java Kako se deava izuzetak
Obrada gre
greaka pomo
pomou izuzetaka 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

SI1P1 2004 229/15 SI1P1 2004 230/15

ta predstavlja izuzetak? Terminologija

Izuzetak je dogaaj koji se dogodio tokom Kada se izuzetak (exception) dogodi koristi se izraz
izvravanja programa i moe da prouzrokuje prekid da je baen izuzetak (throw)
normalnog toka izvravanja instrukcija Kada se izvre odreene operacije sa izuzetkom
Mogui razlozi izuzetaka: kae se da je izuzetak obraen (handled)
Pristup elementu izvan granica niza Deo koda pomou koga se izvre odreene operacije
Pokuaj upisa u read-only dokument sa izuzetkom naziva se obrada izuzetaka (exception
Pokuaj itanja nakon kraja dokumenta handler)
Slanje nelegalnih argumenata nekom metodu
Nelegalne aritmetike operacije (n.p. deljenje sa 0)
Otkaz hardverskih resursa

SI1P1 2004 231/15 SI1P1 2004 232/15

58
Zato koristiti izuzetke Poruke kod izuzetaka

Pomou kompajliranja ne mogu se odrediti sve public class ArrayExceptionExample{


greke public static void main(String args[]) {
Na ovaj nain se odvaja kod za obradu izuzetaka od String[] names = {Bilha", Robert"};
ostalog, regularnog koda System.out.println(names[2]);
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 Naredba println u navedenom kodu e dovesti do
Mogu se grupisati i odvojiti razliiti tipovi greaka greke i sledee poruke pri obradi datog izuzetka:
Mogu se obraditi greke koje prouzrokuju veoma Exception in thread "main"
specifine izuzetke java.lang.ArrayIndexOutOfBoundsException: 2 at
ArrayExceptionExample.main(ArrayExceptionExample.j
ava:4)
SI1P1 2004 233/15 SI1P1 2004 234/15

Poruke kod izuzetaka Primeri

Poruke od izuzetaka imaju sledei format: Poruka kod izuzetka u primeru sa nizovima
java.lang.ArrayIndexOutOfBoundsException: 2 at
ArrayExceptionExample.main(ArrayExceptionExample.j
[exception class]: [additional ava:4)
description of exception] at Koja je klasa izuzetka?
java.lang.ArrayIndexOutOfBoundsException
[class].[method]([file]:[linenumber])
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?
SI1P1 2004 235/15
4
SI1P1 2004 236/15

59
Generisanje izuzetaka Obrada izuzetaka

Svi metodi mogu koriste naredbu throw da bi Moe se koristiti try-catch blok da bi se obradio
prihvatili izuzetak izuzetak koji se desio
if (student.equals(null)) try{
throw new NullPointerException(); // kod u okviru koga moe da se desi izuzetak
Naredba throw zahteva poseban argument: }
throwable objekat catch([Tip izuzetka] e) {
Ova vrsta objekata je instanca bilo koje podklase // ta da se izvri ako se desio izuzetak
Throwable klase }
Ova klasa obuhvata sve tipove greaka i izuzetaka
U okviru opisa API mogu se pronai i opisi svih
throwable objekata

SI1P1 2004 237/15 SI1P1 2004 238/15

Obrada vie izuzetaka istovremeno finally blok

Vie moguih izuzetaka se moe istovremeno Moe se koristiti opcioni finally blok na kraju try-catch bloka
finally blok obezbeuje mehanizam da regulie sve to se deilo
obraditi pomou vie sukcesivnih catch blokova u okviru try bloka
try{ Moe se iskoristiti za zatvranje fajla ili oslobaanja nekog
drugog resursa
// kod u okviru koga moe da se desi vie izuzetaka Try-Catch-Finally Blok
}
try{
catch (IOException e) { // kod u okviru koga moe da se desi izuzetak
// obrada IOException }
catch([Type of Exception] e) {
} // ta da se izvri ako se desio izuzetak
catch (ClassNotFoundException e2) { }
finally{
// obrada ClassNotFoundException
// naredbe u okviru bloka e se uvek izvriti
} // bez obzira ta e se dogoditi u okviru bloka
}
SI1P1 2004 239/15 SI1P1 2004 240/15

60
Izuzeci koji se ne mogu proveravati Izuzeci koji se mogu proveriti

Izuzeci koji se ne mogu proveravati (unchecked Izuzeci koji se mogu proveriti (checked exceptions)
exceptions) ili runtime izuzeci se pojavljuju u okviru ili non-runtime exceptions su izuzeci koji se mogu
Java runtime sistema desiti izvan Java runtime sistema
Primeri ovih izuzetaka Na primer izuzeci koji se mogu desiti tokom
Aritmetike operacije (deljenje sa nulom) ulazno/izlaznih operacija su non-runtime izuzeci
pointer exceptions (pokuaj da se pristupi lanu Kompajler proverava da li su non-runtime izuzeci
objekta pomou null reference) obraeni (ili specificirani korienjem throws
Izuzeci sa indeksima (pokuaj da se pristupi naredbe)
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 SI1P1 2004 242/15

Obrada izuzetaka koji se mogu proveriti Hijerarhija klasa


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 243/15 SI1P1 2004 244/15

61
Nasleivanje i izuzeci Pisanje sopstvenih izuzetaka

Metod moe specificirati manje izuzetaka, ali ne Postoje najmanje 2 tipa konstruktora izuzetaka:
vie od metoda koji nasleuje Default konstruktor: bez argumenata
public class MyClass { NullPointerExceptione = new NullPointerException();
public void doSomething() throws IOException, Konstruktor koji ima detaljnu poruku: postoji jedan
SQLException { String argument
// do something here IllegalArgumentExceptione e =
} new IllegalArgumentException(Broj mora biti
} pozitivan");
public class MySubclass extends MyClass {
public void doSomething() throws IOException {
// do something here
}
}
SI1P1 2004 245/15 SI1P1 2004 246/15

Pisanje sopstvenih izuzetaka Checked ili Unchecked?

Sopstveni izuzeci moraju biti podklase klase Exception i Ako korisnik oekuje da se izuzetak pojavi, trebalo
moraju imati najmanje dva standardna konstruktora bi da bude tipa checked
public class MyCheckedException extends
Ako korisnik ne moe da preduzme nita da bi se
IOException{
oporavio od datog izuzetka, trebalo bi da bude
public MyCheckedException() {}
unchecked tipa
public MyCheckedException(String m){
super(m);}
}
public class MyUncheckedException extends
RuntimeException{
public MyUncheckedException() {}
public MyUncheckedException(String m)
{super(m);}
}
SI1P1 2004 247/15 SI1P1 2004 248/15

62
Sadraj lekcije

Izuzeci naruavaju normalno izvravanje instrukcija


u okviru programa
Izuzeci se obrauju pomou try-catch ili try-catch-
finally bloka
Metod specificira postojanje izuzetka pomou throw Uvod u programiranje 1 Java
naredbe
Ulaz-
Ulaz-izlaz
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 SI1P1 2004 250/15

U ovoj lekciji Osnove ulaz/izlaz

Lekcija je podeljena u dva glavna dela: I/O = Input/Output ulaz/izlaz komunikacija


I Ulaz/Izlaz: izmeu raunarskog programa i spoljanjih izvora
Ulaz ili Izlaz, i Byte ili Character nizovi informacija
Najvanije Stream klase i njihova upotreba Ukljuuje: - itanje ulaznih podataka iz izvora
Primeri itanja iz i upisa u tekstualni fajl Upis rezultata u krajnje odredite
Primeri prihvatanja teksta sa tastature itanje i upis su specifirani pomou 4 abstraktne
klase:
Upotreba bafera Reader
II Uvod u postupak parsiranja: Writer
Delimiteri InputStream
OutputStream
StringTokenizer

SI1P1 2004 251/15 SI1P1 2004 252/15

63
Java I/O Streams Input i Output Stream

Java programi komuniciraju sa spoljanjim svetom Objekat pomou koga moemo proitati ulazne
pomou Streams podatke je Input Stream
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, ... Objekat pomou koga moemo prikazati izlazne
podatke je Output Stream

SI1P1 2004 253/15 SI1P1 2004 254/15

Byte i Character Najvanije Stream klase

Byte Streams se koristi da bi se itali i upisivali FileInputStream


podaci koji su u binarnom formatu (1 ili 0) itanje podataka u binarnom formatu iz fajlova
Na primer slike, zvuk, ... FileOutputStream
Character Streams se koristi da bi se itali i upisivali Upis podataka u binarnom formatu u fajlove
podaci koji su u tekstualnom formatu (karakteri) FileReader
Na primer tekstualni fajlovi, web stranice, unos itanje tekstualnih podataka iz fajlova
korisnika pomou tastature, ...
FileWriter
Upis tekstualnih podataka u fajlove

SI1P1 2004 255/15 SI1P1 2004 256/15

64
Rad sa Stream klasama Java I/O klase

1. Otvaranje streama instanciranjem novog stream Paket java.io sadri klase koje s ekoriste za
objekta itanje/upis podataka iz/u fajlove
2. Rad sa informacijama pomou read/write, Da bi se itali/upisivali podaci, moraju se intancirati
read/write u okviru metoda Stream klasa podklase jedne od sledee 4 abstraktne superklase:
3. Zatvaranje streama pozivom close() metoda datog
objekta

SI1P1 2004 257/15 SI1P1 2004 258/15

Upotreba Reader klase 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 SI1P1 2004 262/15

Klasa Writer Upis u tekstualni fajl

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

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

SI1P1 2004 265/15 SI1P1 2004 266/15

Prihvatanje podataka sa tastature Zakljuak

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 267/15 SI1P1 2004 268/15

67
Parsiranje Delimiteri

U okviru programa podaci se obino Kada su podaci smeteni u tekstualnom formatu,


konvertuju u tekstualni format pre nego to delimiter karakteri se koriste da bi se odvojili delovi
(tokens) podataka
se upiu u fajlove
Na primer pojedinana imena u listi su odvojena
Kasnije je potrebno upisane podatke iz pomou delimitera '#':
tekstualnih fajlova konvertovati u originalne Lana#Pera#Maja#Mika
podatke Ista lista sa delimiterom novom linijom:
Proces dekodovanje teksta u podatke se jo Lana
naziva i parsiranje Pera
Maja
Mika
Ostali delimiteri koji se koriste su | ili : ili tab

SI1P1 2004 269/15 SI1P1 2004 270/15

StringTokenizer StringTokenizer

Kada se pokuava proitati nova ulazna linija, kao Kada se formira tokenizer objekat, potrebno je
rezultat se dobija jedan, u optem sluaju dugaki specificirati koji se karakteri koriste kao delimiteri u
string. konkretnom sluaju
Potrebno je pronai delimitere u okviru tog stringa i Default konstruktori pretpostavljaju da su \t\n\r
odvojiti svaki pojedinani deo informacije (tokens) delimiteri
Da bi se obavila ova operacija koristi se klasa StringTokenizerr = new StringTokenizer(line);
StringTokenizer u okviru paketa java.util Drugi konstruktori prihvataju kao argument String
koji moe definisati proizvoljan niz karaktera kao
delimiter

String line = myFile.readline();


StringTokenizert = new StringTokenizer(line, #);
SI1P1 2004 271/15
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