תונכתל אובמ · 2015-11-22 · תוגירח הציר ןמזב תויעב רצוויהל...

26
מבוא לתכנות קבצים וחריגות

Upload: others

Post on 03-Aug-2020

8 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: תונכתל אובמ · 2015-11-22 · תוגירח הציר ןמזב תויעב רצוויהל תולוכיש ןובשחב איבמ Java •:הלאשה • הלאכ תויעב תולגתמ

מבוא לתכנות

קבצים וחריגות

Page 2: תונכתל אובמ · 2015-11-22 · תוגירח הציר ןמזב תויעב רצוויהל תולוכיש ןובשחב איבמ Java •:הלאשה • הלאכ תויעב תולגתמ

הדיסקשל תכניות ונתונים להישמר לנפח גדול כדי לאפשר •

המחשב מצויד במה שנקרא , במערכתלתקופה ארוכה דיסק

סוגים של דיסקים• קשיח––On key –CD ועוד–

תכונות של דיסק• נפח גדול– אינו נדיף– זול אך פשוט ואיטי יחסית–

Page 3: תונכתל אובמ · 2015-11-22 · תוגירח הציר ןמזב תויעב רצוויהל תולוכיש ןובשחב איבמ Java •:הלאשה • הלאכ תויעב תולגתמ

הקובץ

התוכניות והנתונים נשמרים על הדיסק ביחידות • קבציםהנקראות

Page 4: תונכתל אובמ · 2015-11-22 · תוגירח הציר ןמזב תויעב רצוויהל תולוכיש ןובשחב איבמ Java •:הלאשה • הלאכ תויעב תולגתמ

מחיצות

הקבצים מאורגנים על הדיסק במבנה היררכי של • מחיצות

Page 5: תונכתל אובמ · 2015-11-22 · תוגירח הציר ןמזב תויעב רצוויהל תולוכיש ןובשחב איבמ Java •:הלאשה • הלאכ תויעב תולגתמ

סוגי קבצים

תכניות• קבצים שמכילים קוד–

ספריות של פונקציות מקומפלות ועוד, תכניות מקומפלות•

נתונים• קבצים שמכילים נתונים–

רשומות ועוד, טקסטים•

Page 6: תונכתל אובמ · 2015-11-22 · תוגירח הציר ןמזב תויעב רצוויהל תולוכיש ןובשחב איבמ Java •:הלאשה • הלאכ תויעב תולגתמ

קבצי נתונים

סדרתיים או רנדומאליים•

byte sequence

record sequence

tree

Page 7: תונכתל אובמ · 2015-11-22 · תוגירח הציר ןמזב תויעב רצוויהל תולוכיש ןובשחב איבמ Java •:הלאשה • הלאכ תויעב תולגתמ

גישה לקובץ

גישה של תכניות לקובץ נעשית בשלושה שלבים• )open(פתיחה – )seek -ו read ,write(שימוש – )close(סגירה –

Page 8: תונכתל אובמ · 2015-11-22 · תוגירח הציר ןמזב תויעב רצוויהל תולוכיש ןובשחב איבמ Java •:הלאשה • הלאכ תויעב תולגתמ

קבצי טקסט

רצף של שורות של תווים• :גישה•

קריאה– פתיחה• הלאהוקריאת התווים ברצף מהתו הראשון • סגירה•

כתיבה– פתיחה• כתיבת התווים ברצף מהתו הראשון והלאה• סגירה•

Page 9: תונכתל אובמ · 2015-11-22 · תוגירח הציר ןמזב תויעב רצוויהל תולוכיש ןובשחב איבמ Java •:הלאשה • הלאכ תויעב תולגתמ

Java -קבצים ב

יש קבוצה גדולה של מחלקות שמטפלות Java -ל• בקבצים מכל סוג ומין

המחלקות מסודרות ברמות•ברמה התחתונה מחלקות שפועלות ישירות על הקובץ –

)seek -ו get ,put(פעולות פרימיטיביות באמצעות מעליהן מחלקות עוטפות שניגשות לקבצים באמצעות –

פעולות נוחות יותר המחלקות התחתונות ומספקות )println -ו readLine(לשימוש

Page 10: תונכתל אובמ · 2015-11-22 · תוגירח הציר ןמזב תויעב רצוויהל תולוכיש ןובשחב איבמ Java •:הלאשה • הלאכ תויעב תולגתמ

כתיבה לקובץ

import java.io.*; public static void main(String[] args) throws IOException { FileWriter fw = new FileWriter("out.txt"); PrintWriter pw = new PrintWriter(fw); pw.println("First line to write!"); pw.println("Second line!"); pw.close(); fw.close(); }

Page 11: תונכתל אובמ · 2015-11-22 · תוגירח הציר ןמזב תויעב רצוויהל תולוכיש ןובשחב איבמ Java •:הלאשה • הלאכ תויעב תולגתמ

קריאה מקובץ

import java.io.*; public static void main(String[] args) throws IOException { FileReader fr = new FileReader("out.txt"); BufferedReader br = new BufferedReader(fr); String s1 = br.readLine(); while (s1 != null) { System.out.println(s1); s1 = br.readLine(); } br.close(); fr.close(); }

Page 12: תונכתל אובמ · 2015-11-22 · תוגירח הציר ןמזב תויעב רצוויהל תולוכיש ןובשחב איבמ Java •:הלאשה • הלאכ תויעב תולגתמ

תוכניתשיוצרת תוכנית

import java.io.*; import java.util.Scanner; public static void main(String[] args) throws IOException { Scanner sc = new Scanner(System.in); FileWriter fw = new FileWriter("MyName.java"); PrintWriter pw = new PrintWriter(fw); System.out.print("Please enter name: "); String name = sc.next(); pw.println("public class MyName {"); pw.println("\t" + "public static void main(String args[]) {"); pw.println("\t\t" + "System.out.println(\"" + name + "\");"); pw.println("\t" + "}"); pw.println("}"); pw.close(); fw.close(); }

Page 13: תונכתל אובמ · 2015-11-22 · תוגירח הציר ןמזב תויעב רצוויהל תולוכיש ןובשחב איבמ Java •:הלאשה • הלאכ תויעב תולגתמ

בעיות שמתגלות בזמן ריצה תוכנית שכתבנובעיות ב•

המחיצה או הקובץ שמנסים לפתוח לא קיימים, הדיסק– למחיצה או לקובץ, אין הרשאה לגשת לדיסק– אין מקום בדיסק להוסיף נתונים לקובץ– )מעבר לסוף הקובץ(ניסיון לקרוא נתונים לא קיימים – ועוד–

ובאופן כללי•

העברת פרמטרים– חריגות ממערכים– חלוקה באפס– ועוד–

Page 14: תונכתל אובמ · 2015-11-22 · תוגירח הציר ןמזב תויעב רצוויהל תולוכיש ןובשחב איבמ Java •:הלאשה • הלאכ תויעב תולגתמ

חריגות•Java מביא בחשבון שיכולות להיווצר בעיות בזמן ריצה :השאלה•

מה לעשות כאשר מתגלות בעיות כאלה– :פתרונות לא כל כך טובים•

להמשיך לרוץ כאילו לא קרה כלום– לעצור את התוכנית מריצתה–

:פתרון טוב• לזרוק חריגה–

ברגע בו מתבצעת ההוראה הבעייתית לעצור את ריצת הפונקציה ולהודיעה על • הבעיה

אולי הפונקציה יכולה לתקן את הבעיה• מה עלול לזרוק חריגה–

וכדומה, ביטוי שמכיל חלוקה באפס, הוראות כמו אינדקס במערך• קריאה מקובץ ועוד, שיטת שקראנו להן כמוה פתיחה וסגירה של קובץ•

Page 15: תונכתל אובמ · 2015-11-22 · תוגירח הציר ןמזב תויעב רצוויהל תולוכיש ןובשחב איבמ Java •:הלאשה • הלאכ תויעב תולגתמ

מגדיר משפחה שלמה של חריגות Java• סוגי חריגותבאמצעות מחלקות מוכנות מראש

)י המתכנתים"שניתנת להרחבה ע( Exceptionהתוכניות מטפלות בחריגות מסוג –אינן אמורות להיות Errorחריגות מסוג –

י התוכנית"מטופלות ע

Page 16: תונכתל אובמ · 2015-11-22 · תוגירח הציר ןמזב תויעב רצוויהל תולוכיש ןובשחב איבמ Java •:הלאשה • הלאכ תויעב תולגתמ

חריגות שאולי כבר נתקלנו בהן

• ArithmeticException • IndexOutOfBoundsException • NullPointerException

Page 17: תונכתל אובמ · 2015-11-22 · תוגירח הציר ןמזב תויעב רצוויהל תולוכיש ןובשחב איבמ Java •:הלאשה • הלאכ תויעב תולגתמ

?מה אפשר לעשות עם חריגה

try … catchבעזרת הוראת לתפוס• להתעלם•

חריגה שמתעלמים ממנה נזרק מהפונקציה המתעלמת – לפונקציה הקוראת

החריגה מחלחלת , ואם אף פונקציה לא תופסת אותה– ועוצרת התוכנית main -ונזרקת אף מה main -עד ל

Page 18: תונכתל אובמ · 2015-11-22 · תוגירח הציר ןמזב תויעב רצוויהל תולוכיש ןובשחב איבמ Java •:הלאשה • הלאכ תויעב תולגתמ

משפחות של חריגות•Java מבדיל בין שני סוגי

חריגות )run time(חריגות זמן ריצה –

חלוקה באפס• חריגה מתחום• nullפניה דרך • ועוד•

שאר החריגות– )IO(פלט /חריגות קלט•

קובץ לא קיים– חריגה מעבר לסוף הקובץ– ועוד–

ועוד•

Page 19: תונכתל אובמ · 2015-11-22 · תוגירח הציר ןמזב תויעב רצוויהל תולוכיש ןובשחב איבמ Java •:הלאשה • הלאכ תויעב תולגתמ

מה ההבדל

תוכניתהגורם לחריגות זמן ריצה הוא בדרך כלל • שגויה ברמה הלוגית

ל צריכות להיות מטופלות בעזרת "ולכן החריגות הנ–debug מתאים

יכול להיות ) IO -בפרט ל(הגורם לשאר החריגות • בלתי צפוי

ולכן הוא מצריך התייחסות– )try … catch(אם באמצעות תפיסה • )בכותרת הפונקציה throws(או בהמצאות הכרזה •

Page 20: תונכתל אובמ · 2015-11-22 · תוגירח הציר ןמזב תויעב רצוויהל תולוכיש ןובשחב איבמ Java •:הלאשה • הלאכ תויעב תולגתמ

דוגמה לטיפול באמצעות הכרזה

public static void main(String[] args) throws IOException { FileWriter fw = new FileWriter("out.txt"); PrintWriter pw = new PrintWriter(fw); pw.println("First line to write!"); pw.println("Second line!"); pw.close(); fw.close(); }

Page 21: תונכתל אובמ · 2015-11-22 · תוגירח הציר ןמזב תויעב רצוויהל תולוכיש ןובשחב איבמ Java •:הלאשה • הלאכ תויעב תולגתמ

דוגמה לטיפול באמצעות תפיסה

public static void main(String[] args) { FileWriter fw = null; PrintWriter pw = null; try { fw = new FileWriter("out.txt"); pw = new PrintWriter(fw); pw.println("First line to write!"); pw.println("Second line!"); pw.close(); fw.close(); } catch (IOException e) { e.printStackTrace(); } }

Page 22: תונכתל אובמ · 2015-11-22 · תוגירח הציר ןמזב תויעב רצוויהל תולוכיש ןובשחב איבמ Java •:הלאשה • הלאכ תויעב תולגתמ

throwsהכרזת

בכותרת של הפונקציה•

throws Exception

Page 23: תונכתל אובמ · 2015-11-22 · תוגירח הציר ןמזב תויעב רצוויהל תולוכיש ןובשחב איבמ Java •:הלאשה • הלאכ תויעב תולגתמ

try … catch -הוראת ה

try { … } catch (Exception1 e) { … } catch (Exception2 e) { … } finally { … }

Page 24: תונכתל אובמ · 2015-11-22 · תוגירח הציר ןמזב תויעב רצוויהל תולוכיש ןובשחב איבמ Java •:הלאשה • הלאכ תויעב תולגתמ

זריקת חריגות גם אנחנו בעמנו יכולים לזרוק חריגות• ?מתי•

כאשר התוכנית שלנו מגיעה למבוי סתום–•null או מערך ריק כפרמטר לפונקציה שמחפשת איבר מינימלי במערך

public int minValue (int [] arr) { if (arr == null || arr.length == 0) throw new IllegalArgumentException( "Shouldn't be null or empty array"); else { … } }

Page 25: תונכתל אובמ · 2015-11-22 · תוגירח הציר ןמזב תויעב רצוויהל תולוכיש ןובשחב איבמ Java •:הלאשה • הלאכ תויעב תולגתמ

דוגמה

public static int minValue(String input) throws IOException { FileReader fr = new FileReader(input); // FileNotFoundException BufferedReader br = new BufferedReader(fr); // NullPointerException String s1 = br.readLine(); // IOException if (s1 == null) { fr.close(); // IOException throw new ArithmeticException("There's no minimum for an empty set of values"); } int min = Integer.parseInt(s1); // NumberFormatException do { s1 = br.readLine(); // IOException if (s1 != null) { int t = Integer.parseInt(s1); // NumberFormatException if (t < min) min = t; } } while (s1 != null); br.close(); // IOException fr.close(); // IOException return min; }

Page 26: תונכתל אובמ · 2015-11-22 · תוגירח הציר ןמזב תויעב רצוויהל תולוכיש ןובשחב איבמ Java •:הלאשה • הלאכ תויעב תולגתמ

דוגמה

public static void main(String[] args) throws IOException { Scanner in = new Scanner(System.in); // NullPointerException boolean done; do { done = true; System.out.println("Input file name? "); String file = in.next(); // NoSuchElementException, IllegalStateExceptio

try { System.out.println("Minimum = " + minValue(file)); } catch (FileNotFoundException e) { System.out.println(file + " not found!"); done = false; } catch (Exception e) { in.close(); throw e; } } while (!done); in.close(); }