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

Preview:

Citation preview

מבוא לתכנות

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

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

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

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

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

הקובץ

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

מחיצות

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

סוגי קבצים

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

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

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

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

קבצי נתונים

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

byte sequence

record sequence

tree

גישה לקובץ

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

קבצי טקסט

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

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

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

Java -קבצים ב

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

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

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

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

כתיבה לקובץ

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(); }

קריאה מקובץ

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(); }

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

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(); }

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

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

ובאופן כללי•

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

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

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

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

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

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

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

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

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

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

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

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

• ArithmeticException • IndexOutOfBoundsException • NullPointerException

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

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

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

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

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

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

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

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

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

ועוד•

מה ההבדל

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

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

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

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

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

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(); }

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

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(); } }

throwsהכרזת

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

throws Exception

try … catch -הוראת ה

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

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

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

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

דוגמה

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; }

דוגמה

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(); }

Recommended