Java pagrindai
description
Transcript of Java pagrindai
Java pagrindai
2 paskaita
lekt. dr. Asta Slotkienė
Turinys
Situacijų valdymas Įvestis klaviatūra Įvestis/išvestis failuose
KlaidosProgramose pasitaiko klaidų ir į jas reikia reaguotiGerai parašyta programa visada turi ir klaidų
apdorojimo kodąSituacijos – tai atvejai, kai programoje nutinka:
Netikėta klaidaSpecialiai programuotojo sumodeliuota klaida
3
Klasikinės klaidų tikrinimo priemonės
ifswitchreturn kodas
kartojimo ciklaiexitgotopranešimai
4
Situacijos Situacijos, kurios skirtos klaidų išvengimui, reaguoja į
klaidas ir atlieka veiksmus, nurodytus programoje arba perduoda klaidų apdorojimą kitiems metodams
Situacija – tai įvykis, nutraukiantis įprastą programos darbą. Tai gali būti klaida programoje arba specialiai programuotojo numatyta situacija
Kiekvienai situacijai Java kalboje sukuriamas atitinkamos klasės objektas
5
Klaidos šaltiniaiPavyzdys
class Exc0 {
public static void main(String args[]) {
int d = 0;
int a = 42 / d;
}
}
Išvestis
java.lang.ArithmeticException: / by zero at Exc0.main(Exc0.java:4)
Exception in thread "main"
6
7
Klaidos susidarymas
public int vidurkis(int mas[ ], int n) { int vid = 0;for (int i = 0; i < n; i++) { vid += mas[i]; }vid = vid / n; return vid;}
Klaida: ArrayIndexOutOfBoundsException
8
Tradicinis klaidos sprendimas
Kodas su galimos klaidos apdorojimu:
public int vidurkis(int mas[ ], int n) { int vid = 0; for (int i = 0; i < n; i++) { if (i >= mas.length) { System.out.println(“KLAIDA: Neteingas n"); System.out.println(“Vidurkis gali buti netikslus"); break; // nutraukiame ciklo kartojima } vid += mas[i]; } vid = vid / n; return vid;}
Sprendimas su situacijomis
public int vidurkis(int mas[ ], int n) { int vid = 0; try { for (int i = 0; i < n; i++) { vid += mas[i]; } } catch (ArrayIndexOutOfBoundsException situacija) { System.out.println(“KLAIDA: Neteingas n"); System.out.println(“Ciklas nutrauktas. Vidurkis netikslus"); } vid = vid / n; return vid;}
Pagrindinės situacijų klasės
Object
Trowable
Exception Error
ClassNotFoundExceptionNotSuchMethodExceptionIOException
EOFExceptionFileNotFoundException...
...
RunTimeException
ArithmeticException
ClassCastException
NullPointerException
...
StackOverflowError
OutOfMemoryError
UnknownError
...
Java kalboje klaidoms apdoroti skiriama klasė Object ---Trowable --- Exception
Trowable klasė
Error klasės situacijos susijusios su JVM darbu, todėl šios situacijos programuotojo neapdorojamos
Exception klasė – klaidos privalo būti sugautos ir apdorotos
RuntimeException – kompiliatoriaus nekontroliuojamos klaidos
11
Java priemonės
try – catch blokaisakinys throwatributas throws , kuris deklaruoja reakcija į
situacijasfinally blokas
12
try – catch blokas
try {
// veiksmai, kur gali įvykti situacijos
//veiksmai, kurie turi būti kontroliuojami
}
catch (ExceptionType1 s) {
// veiksmai įvykus situacijai 1
}
catch (ExceptionType2 s) {
// veiksmai įvykus situacijai 2
}13
try – catch blokai
try blokas privalo turėti arba nors vieną catch (arba finally)
catch be try būti negalitry blokai gali turėti vidinius try blokus su savo
catch Įvykus try bloke situacijai, tolimesni sakiniai šiame
bloke nebevykdomi - ieškomas atitinkamas catch blokas
Įvykdžius catch bloką, likusieji catch blokai ignoruojami ir vykdomi sakiniai, esantys už paskutinio to lygio catch bloko14
Vidiniai try-catch
try {// veiksmai
try { // veiksmai
} catch (ExceptionType1 s) { // veiksmai }
} catch (ExceptionType2 s) { // veiksmai }
try – catch pavyzdystry {
String sk=ob.readLine(); //IOException
x=Integer.parseInt(sk); // NumberFormatException
sum=sum+x;
} catch (NumberFormatException e){
System.out.println("Klaida. Įvedėte ne skaičių");
}
catch (IOException e){
System.out.println(“Ivedimo klaida");
}
Jei įvesime raidę, tuomet bus “sugauta” klaida ir vykdomi catch bloke nurodyti sakiniai
16
try { while (true) { //amzinasis ciklas
System.out.print("Iveskite skaiciu: "); String s = klaviatura.readLine(); int x = Integer.parseInt(s);
if (x < 0) { System.out.println("X neigiamas, iveskite teigiama verte"); } else { System.out.println("Teigiamas x ir lygus: " + x); break; //nutrauks ciklo vykdyma } } } catch (NumberFormatException e) { System.out.println("Ivedete ne skaiciu");} catch (IOException e) { System.out.println("Klaida"); }
Kartoti ar ne?
Kartoti ar ne?int bandymuSkaicius = 0;while (true) { // amžinas ciklas try { // skaičiavimai, galintys iššaukti situaciją } catch (ExceptionType e) { bandymuSkaicius ++; if (bandymuSkaicius < maxKiekis) { // veiksmai pakartotinai situacijai išvengti } else { System.exit();
// gali buti ir break arba return } }} // while pabaiga
18
Paveldėjimas
19
PavyzdysTeisinga
try
{
//veiksmai
}catch (EOFException e){
//veiksmai
}
catch (IOException e){
//veiksmai
}
Klaidinga
try
{
//veiksmai
} catch (IOException e){
//veiksmai }
catch (EOFException e){
//veiksmai
}
20
Išimčių pavyzdžiai FileNotFoundException (java.io)
Nepavyko atidaryti prašyto failo IllegalArgumentException (java.lang)
Netinkamas metodo naudojimas / nepatvirtinti argumentai
IOException (java.io) Pagrindinės Į/I klaidos
NullPOinterException (java.lang) Bandymas pasiekti objektą, naudojant netinkamą
nuorodą UnsupportedOperationException (java.lang)
Nepalaikomas operatorius21
throw atributas
Leidžia iššaukti situaciją dirbtinai (sumodeliuoti).Sintaksė :
throw SituacijosKlasėsObjektas;Pvz:
catch(Exception e) {
// klaidos apdorojimo veiksmai šiame lygyje
throw e; // veiksmai aukštesniame lygyje
}
22
Sakinys throwsJei metode gali susidaryti situacija, bet metodas
pats jos neapdoroja, tai metodo antraštėje po atributo throws būtina jas išvardinti.
Tokiu būdu jų apdorojimas persiunčiamas atgal - į šio metodo iškvietimo zoną
public void skaito() throws FileNotFoundException
{
// Jei šiame metode įvyks situacija “failas nerastas”,
// tai ji bus apdorota jį iškvietusiame bloke
}
23
Sakinys finallyJis vykdomas visada – įvyko situacija ar ne, buvo
ji sugauta ir apdorota ar nebuvo.
finally {
// veiksmai
}P.S
Po try bloko vietoje catch gali eiti finally blokas.
Finally vykdomas prieš išeinant iš metodo.
24
Finallytry {
// veiksmai, kur gali įvykti situacijos
//veiksmai, kurie turi būti kontroliuojami
}
catch ([Exception tipas] e) {
// veiksmai įvykus situacijai 1
}
finally {
//kosmetiniai veiksmai
}
25
Exceptions klasių kūrimas
class ManoSituacija extends Exception {
public ManoSituacija () { }
public ManoSituacija (String turinys) {
super(turinys);
}
}
Exceptions klasių kūrimasclass MyException extends Exception { }
class MyClass {
void klaida() {
if (/*logine salyga klaidai neivykti*/){
//veiksmai
}
else {
// veiksmai klaidai įvykus
throw new MyException(); }
}
}27
Pavyzdyspublic float dalyba(int a, int b) {
float r;
try {
r = a / b;
} catch (ArithmeticException e) {
System.out.println(e.getMessage());
r = Float.POSITIVE_INFINITY;
}
return r;
}
28
Įvestis ir išvestis
Įvedimas / išvedimas Įvedimas / išvedimas (IO) Java kalboje organizuotas per
srautus (stream). Standartiniai srautai operuoja su baitais. Dirbant su Unicode simboliais patogiau dirbti su simboliniais
srautais (reader ir writer). Srautas Java kalboje atitinka klasę. Java apibrėžia tris standartinius srautus:
Standartinio įvedimo System.in Standartinio išvedimo System.out Klaidoms skirto išvedimo System.err
Paketas java.io
Įvedimas klaviatūra
java.io.BufferedReader ds = new BufferedReader(new InputStreamReader(System.in));
Pagrindis metodas:String s = ds.readline();
32
Įvedimas klaviatūra
Didžioji dalis realizuota pakete java.ioImport java.io.*;Dirbant su šio paketo klasėmis, dažnai
tenka naudoti try {...} catch konstrukciją ir išimtis throws
33
import java.io.*;
public class Labas {
public static void main (String args[]) throws IOException {
BufferedReader skaito = new BufferedReader(new InputStreamReader(System.in));
System.out.printlt (“Labas, iveskite savo varda”);
String vardas = skaito.readLine();
System.out.println(“Mano vardas yra ”+vardas);
}
34
import java.io.*;
public class Suma {
public static void main(String args[]) throws IOException {
String reiksme1, reiksme2;
int x1 = 0;
double x2 = 0.0, suma = 0.0;
BufferedReader skaito = new BufferedReader(new InputStreamReader(System.in));
try{
reiksme1 = skaito.readLine();
x1 = Integer.parseInt(reiksme1);
} catch (NumberFormatException e) {
System.out.println(“Reiksme is klaviaturos nera sveikas skaicius.“);
return;
}
try {
reiksme2 = skaito.readLine();
x2 = Double.parseDouble(reiksme2);
suma = x1+x2;
System.out.println(“Suma ”+suma);
} catch (NumberFormatException e) {
System.out.println(“Reiksme nera skaicius, suma negalima.“); }
}35
Darbas su failais
import java.io.file
36
Duomenų skaitymas iš tekstinio failo
File f = new File (“input.txt”);BufferedReader br = new BufferedReader( new FileReader (f));
FileReader fr = new FileReader(“input.txt”);BufferedReader br = new BufferedReader(new (fr););
Metodai br.read(); br.readLine();
Skaitymas iš failo:String s;while((s = br.readLine()) != null) {
System.out.println(s);}
file FileReaderFilter
(BufferedReader)
Skaitymas iš failo
BufferedReader ds = new BufferedReader(new FileReader(“D:/Java/IO/Duom.dat”));
Arba
File f1 = new File(“D:/Java/IO”, “Duom.dat”);
BufferedReader ds = new BufferedReader(new FileReader(f1));
38
Skaitymas iš failo
Pilnas kelias iki failo: File f = new File("D:/Mano/Duom.dat");
Kelias ir failo vardas: File f = new File("D:/Mano”, “Duom.dat");
Kai failas yra kur ir NetBeans projektas File f = new File(". ", "Duom.dat");
Skaitymas iš failo
import java.io.*;
class FailoSkaitymas {
public static void main(String args[]) throws Exception {
FileReader fr = new FileReader(“Failas.txt");
BufferedReader skaito = new BufferedReader(fr);
String s;
while((s = skaito.readLine()) != null) { //tikrina ar eilute netuscia
System.out.println(s); //atspausdins is failo perskaityta viena eilute
}
fr.close(); //baigus ciklas uzdaro skaitymo faila
}
}
41
Rašymas į failą
PrintWriter pr = new PrintWriter(new FileWriter(“D:/Java/IO/Rez.dat”));
Arba
File f1 = new File(“D:/Java/IO”, “Rez.dat”);
PrintWriter pr = new PrintWritter(new FileWriter(f1));
42
Įvestis ir išvestis tekstiniame faileĮvestis ir išvestis tekstiniame faile
Papildomos IO klasės StringTokenizer – simbolių srauto skaidymas į “žodžius”. Metodai:
hasMoreElements – gražina boolean tipo reikšmę nextElement
StringTokenizer pavydys
import java.util.*;public class Stringtok {
public static void main(String [] args) {
String eil = “Tai yra eilute";
StringTokenizer Tok = new StringTokenizer(eil); int n=0;
while (Tok.hasMoreElements()) System.out.println("" + ++n +": "+Tok.nextElement()); }}
import java.util.StringTokenizer; public class StringTokenizerSample { public static void main(String[] args) { StringTokenizer st = new StringTokenizer("a stringtokenizer sample"); System.out.println("tokens count: " + st.countTokens()); // kiek yra eilute yra token while (st.hasMoreElements()) // kartojasi ciklas tol, kol eiluteje yra token'u { String token = st.nextElement().toString(); System.out.println("token = " + token); }
st = new StringTokenizer("2005/12/15", "/");// sudalina datos eilute, kai token skiria "/" while (st.hasMoreElements()) { String token = st.nextToken(); System.out.println("token = " + token); } }} Rezultatas:tokens count: 3token = atoken = stringtokenizertoken = sampletoken = 2005token = 12token = 15
47
KomentaraiNaudojant įvesties ir išvesties srautus su failais
visada naudokite situacijų apdorojimą:FileNotFoundExceptionIOException
Nuskaitymo ir įrašymo failai turi būti sukurti ir žinoma tiksli jų vieta
48
Failo nuskaitymas
Duomenų įrašymas į failą