500 likes | 792 Views
Java pagrindai. 2 paskaita lekt. dr. Asta Slotkienė. Turinys. Situacijų valdymas Įvestis klaviatūra Įvestis/išvestis failuose. Klaidos. Programose pasitaiko klaidų ir į jas reikia reaguoti Gerai parašyta programa visada turi ir klaidų apdorojimo kodą
E N D
Java pagrindai 2 paskaita lekt. dr. Asta Slotkienė
Turinys • Situacijų valdymas • Įvestis klaviatūra • Įvestis/išvestis failuose
Klaidos • Programose pasitaiko klaidų ir į jas reikia reaguoti • Gerai parašyta programa visada turi ir klaidų apdorojimo kodą • Situacijos – tai atvejai, kai programoje nutinka: • Netikėta klaida • Specialiai programuotojo sumodeliuota klaida 3
Klasikinės klaidų tikrinimo priemonės if switch return kodas kartojimo ciklai exit goto praneš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 šaltiniai Pavyzdys 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
Klaidossusidarymas 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
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 (ArrayIndexOutOfBoundsExceptionsituacija) { 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 ClassNotFoundException NotSuchMethodException IOException EOFException FileNotFoundException ... ... 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 blokai sakinys throw atributas throws , kuris deklaruoja reakcija į situacijas finally 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 negali try 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 bloko 14
Vidiniai try-catch try { // veiksmai try { // veiksmai } catch (ExceptionType1 s) { // veiksmai } } catch (ExceptionType2 s) { // veiksmai }
try – catch pavyzdys try { 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
Kartoti ar ne? 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? 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
Pavyzdys Teisinga 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 operatorius 21
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 throws Jei 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 finally • Jis 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
Finally try { // 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ūrimas class MyException extends Exception { } class MyClass { void klaida() { if (/*logine salyga klaidai neivykti*/){ //veiksmai } else { // veiksmai klaidai įvykus throw new MyException(); } } } 27
Pavyzdys public 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
Į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
java.lang.Object FileInputStream, ObjectInputStream, ... Byte I/O InputStream FileOutputStream, ObjectOutputStream, ... OutputStream File ObjectStreamClass ObjectTokenizer BufferedReader, InputStreamReader, ... Reader FileReader Writer Unicode I/O 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.io Import 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(newInputStreamReader(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 FileReader Filter (BufferedReader)
Skaitymas iš failo BufferedReader ds =new BufferedReader(new FileReader(“D:/Java/IO/Duom.dat”)); Arba Filef1=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 } }
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
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; publicclass 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: 3 token = a token = stringtokenizer token = sample token = 2005 token = 12 token = 15
Komentarai • Naudojant įvesties ir išvesties srautus su failais visada naudokite situacijų apdorojimą: • FileNotFoundException • IOException • Nuskaitymo ir įrašymo failai turi būti sukurti ir žinoma tiksli jų vieta 48