ידע מול כישורים
המכללה לימדה אותנו שאין הבדל גדול בין תיאוריה לפרקטיקה. ובכן, אתה בוודאי מבין שזה לא אותו הדבר. אבל אתה לא רואה את ההבדל הליבה. ובכל זאת יש אחד. רוב האנשים שמים את סימן השוויון בין "אני יודע" ל"אני יכול". האם אתה? מה דעתך על כמה דוגמאות?- אני יודע שעישון מזיק לי, אבל אני מעשן.
- אני יודע שמזון מהיר מזיק לי, אבל אני אוכל אותו.
- אני מכיר את חוקי התעבורה אבל אני לא יכול לנהוג.
- אני יודע שריצה טובה בשבילי אבל אני לא רץ בבוקר.
הגעת לרמה חדשה
רמה 9
1 רישה, עקבות מחסנית
- היי! היום אני אגיד לך מה זה מעקב מחסנית. אבל קודם תן לי להסביר לך מהי הערימה. - דמיינו ערימת ניירות - משימות לפקיד מסוים. ניתן לשים מטלה חדשה בראש הערימה, והוא ייקח מטלה מהחלק העליון של הערימה. לפיכך, מטלות יבוצעו לא על כל הקודם זוכה. בכל פעם שהפקיד לוקח את המשימה שמגיעה אחרונה. מבנה כזה של איסוף נקרא מחסנית . - ב-Java, יש אוסף מיוחד - Stack. לאוסף הזה יש שיטות "הוסף אלמנט" ו-"קח (קבל/קח) אלמנט". כפי שאתה כבר יודע, האלמנט האחרון שנוסף יילקח ראשון. - הממ. זה לא קשה, אני מניח. - בסדר גמור. אז תן לי להסביר מה זה מעקב מחסנית . - תארו לעצמכם שבפונקציה ג'אווה А קוראת לפונקציה B , והאחרונה קוראת לפונקציה C , שבתורה קוראת לפונקציה D . לכן, כדי לצאת מפונקציה B , תחילה עליך לצאת מפונקציה C , וכדי לעשות זאת עליך לצאת מפונקציה D. זה מאוד דומה לערימה. - ומה הדמיון? - בערימה, כדי להגיע למטלה מסוימת, צריך גם להשלים את כל המטלות שהעלו. - ובכן, זו די אנלוגיה, אבל אני לא בטוח אם אני מבין הכל נכון. - תסתכל כאן. ב-Java מחסנית היא קבוצה של אלמנטים. זה כמו גיליונות נייר בערימה. כדי לקחת את השלישי מלמעלה, אתה חייב לקחת את הגיליון השני, אבל לפני זה אתה צריך לקחת את הראשון. אתה תמיד יכול לשים ולקחת סדינים, אבל אתה יכול לשים אותם רק מלמעלה ולקחת רק מלמעלה. אותו הדבר חל על קריאת הפונקציה. פונקציה А קוראת לפונקציה B , האחרונה קוראת לפונקציה C. כדי לצאת מ- А , תחילה עליך לצאת מ- B , וכדי לעשות זאת יש לצאת מ- C. - חכה דקה. אם הבנתי נכון, כל הערימה מתבררת ב"אפשר לקחת רק את הגיליון האחרון שהונח על הערימה" ו"ראשית, הפונקציה האחרונה שנקראה צריכה לצאת". האמנם? - כן. אז, רצף קריאות הפונקציות הוא "מחסנית קריאת הפונקציות", או פשוט "מחסנית קריאות". יש לסיים תחילה את הפונקציה שנקראת last. בואו נסתכל על הדוגמה: - בסדר. הכל ברור עם קריאת הפונקציה, אני מניח. אבל מה זה StackTraceElement ? - מכונה וירטואלית Java רושם את כל קריאות הפונקציה. למטרה זו יש לו אוסף מיוחד - מחסנית. כאשר פונקציה אחת קוראת לאחרת, JVM מציבה אלמנט חדש של StackTraceElementלתוך המחסנית הזו. כאשר הפונקציה מסתיימת, האלמנט נמחק מהמחסנית. לפיכך, מחסנית זו תמיד מאחסנת מידע עדכני על המצב הנוכחי של "מחסנית קריאת הפונקציות". - כל StackTraceElement מכיל מידע על השיטה הנקראת. אז אתה יכול לקבל את השם של שיטה זו באמצעות getMethodName . - הדוגמה שלמעלה מראה זאת:- קבל את "מחסנית השיחות":
- חזור על המערך באמצעות הלולאה for-each . אני מקווה שלא שכחת את זה.
- הדפס שמות שיטות ל- System.out .
2 דייגו, תצוגת משימה על ערימה
היי, אמיגו! הנה משימה קטנה להציג למסך עקבות מחסנית.משימות | |
---|---|
1 | כל שיטה צריכה להחזיר את ה-StackTrace שלה לכתוב חמש שיטות שקוראות אחת לשנייה. כל שיטה צריכה להחזיר את StackTrace שלה. |
2 | StackTrace שוב כתוב חמש שיטות שקוראות זו לזו. כל שיטה צריכה להחזיר את שם שיטת המתקשר שלה. אתה יכול להשיג את שיטת המתקשר באמצעות StackTrace. |
3 | השיטה צריכה להחזיר את מספר השורה של הקוד ששיטה זו נקראה מכתוב חמש שיטות שקוראות זו לזו. כל שיטה צריכה להחזיר את מספר השורה של הקוד שממנו נקראה השיטה הזו. השתמש בפונקציה element.getLineNumber() . |
4 | מעקב מחסנית של 10 שיחות כתוב קוד כדי לקבל מעקב מחסנית של 10 שיחות. |
5 | השיטה צריכה להחזיר תוצאה - עומק עקבות המחסנית שלה כתוב שיטה שמציגה ומחזירה את עומק עקבות הערימה שלה. עומק עקבות מחסנית הוא מספר השיטות שלה (מספר האלמנטים ברשימה). |
3 אלי, שגיאות וחריגים
היי, אמיגו! היום יש לנו שיעור מאוד מעניין. אני אספר לך על חריגים. חריגה היא מנגנון מיוחד לשליטה על שגיאות בתוכנית. הנה כמה דוגמאות לשגיאות שעלולות להתרחש בתוכנית:- התוכנית מנסה לכתוב קובץ לדיסק המלא.
- התוכנית מנסה לקרוא למתודה של משתנה המאחסנת את הפניה null.
- התוכנית מנסה לחלק מספר ב-0.
- כאשר מתרחשת שגיאה, המכונה הווירטואלית של Java יוצרת אובייקט מיוחד - חריג - המכיל את כל המידע על השגיאה. לשגיאות שונות יש חריגים שונים.
- ואז חריג זה מאלץ את התוכנית להפסיק את הפונקציה הנוכחית באופן מיידי, ואת הפונקציה הבאה, עד שהיא יוצאת מהשיטה הראשית. לאחר מכן התוכנית מסתיימת. מפתחי Java קוראים לתהליך זה "מגלגל אחורה את מחסנית השיחות".
- אם מתרחש חריג בתוך בלוק try , הקוד בבלוק זה כבר לא מבוצע, אבל הביצוע של ה- catch block מתחיל.
- אם לא התרחש חריג, חסימת ה-try מבוצעת עד הסוף , וה- catch לעולם לא מבוצע .
4 Elly, RuntimeException, זורק
- החלטתי להעלות עוד נושא היום. ב-Java, כל החריגים מחולקים לשני סוגים - מבוקרים/מבוקרים ובלתי מבוקרים/לא מסומנים . יש לתפוס חריגים מסומנים, ניתן לתפוס ללא סימון אבל זה לא נדרש . - האם אפשר לזרוק חריגים בקוד בכוונה? - בקוד שלך, אתה יכול לזרוק חריגים בעצמך. אתה יכול אפילו לכתוב חריגים משלך. אבל נעמיק בבור הזה מאוחר יותר. כעת נלמד כיצד לעבוד עם החריגים שנזרקו על ידי המכונה הוירטואלית של Java. - בסדר. - אם חריגים ClassNotFoundException ו- FileNotFoundException נזרקים (מופיעים) בשיטה, המתכנת צריך לציין אותם בחתימה של מתודה (כותרת שיטה). חריגים כאלה נבדקים. ככה זה נראה בדרך כלל: - אז אנחנו פשוט כותבים זריקות ומפרטים חריגים מופרדים בפסיקים. ימין? האמנם? - כן. אבל יש עוד דבר מעניין. כדי להרכיב את הדוגמה למטה, השיטה שקוראת ל- method1() צריכה לתפוס את החריגים האלה או לזרוק אותם קדימה. אם אתה רוצה לזרוק חריג מסומן קדימה, עליך לציין זאת בכותרת של השיטה . - שוב, אם בשיטה הראשית , אתה רוצה לקרוא למתודה שביטוי הכותרת שלה זורק FileNotFoundException, ... אז אתה צריך לעשות אחד משני הדברים הבאים:- כדי לתפוס חריגים FileNotFoundException, ...
תצטרך לעטוף את הקוד שבו אתה קורא לשיטה מסוכנת עם בלוק try-catch - לא לתפוס חריגים FileNotFoundException, …
5 רישה, גלגול ערימת השיחות, איך לעשות זאת בחריגים
- אני רוצה לספר לך קצת יותר על אופן הפעולה של חריגים. הדוגמה שלהלן מסבירה כי: - אני לא מבין את זה. - בסדר. אני אסביר מה קורה. - בדוגמה משמאל אנו קוראים למספר שיטות בסדר שרשרת. ב- method2() אנו יוצרים וזורקים באופן ספציפי חריג (כדי ליזום שגיאה). - הדוגמה מימין מראה מה קורה. תסתכל על method2() . לזה הופכת יצירת חריג: אנחנו יוצרים אובייקט מסוג RuntimeException , מאחסנים אותו בחריג משתנה מיוחד ומיד יוצאים מהשיטה – return . - בשיטה1 , לאחר הקריאה של מתודה2 יש בדיקה, אם יש חריג או לא; אם יש חריג, שיטה1 מסתיימת מיד. בדיקה זו מתבצעת באופן מרומז לאחר קריאה לכל (!) שיטת Java. - וואו! - בדיוק. - בעמודה מימין בשיטה הראשית כתבתי מה קורה כאשר חריג נתפס על ידי בלוק ה- try-catch . אם לא היה חריג, הקוד ממשיך לפעול בדיוק כמתוכנן. אם היה חריג מהסוג שצוין ב- catch , אז אנחנו מטפלים בזה. - ומה המשמעות של זריקה ומופע של ? - תסתכל על השורה האחרונה בצד שמאל זרוק חדש RuntimeException(s) . בדרך זו אנו יוצרים וזורקים חריג. זו רק דוגמה. אנחנו לא נעשה את זה עד עכשיו. - באמצעות הפקודה « а מופע של B » בבלוק הימני אנו בודקים האם לאובייקט a יש את הסוג B . כלומר, אם לאובייקט המאוחסן בחריג המשתנה, יש את הסוג RuntimeException . זה ביטוי הגיוני. - ובכן, זה נהיה קצת יותר ברור.6 דייגו, משימה לתפוס חריג
- תסתכל כאן! הדוד דייגו הביא מעט משימות לתפוס עבורך. מאחל לך בהצלחה. אני חושב שאתה תצטרך את זה. אהה. היי, אמיגו! הנה כמה משימות תפיסה חריגות מעניינות.משימות לתפוס | |
---|---|
1 | 1. חריגה כאשר פועלים עם מספרים תפסו את החריג שמתרחש בעת הפעלת הקוד: int a = 42 / 0; הצג את החריג למסך, ציין את סוגו |
2 | 2. חריגה בהפעלה עם מחרוזות תפוס את החריג שמתרחש בעת הפעלת הקוד: String s = null; מחרוזת m = s.toLowerCase(); הצג את החריג למסך, ציין את סוגו. |
3 | 3. חריגה בהפעלה עם מערכים תפוס את החריג שמתרחש בעת הפעלת הקוד: int[] m = new int[2]; m[8] = 5; הצג את החריג למסך, ציין את סוגו. |
4 | 4. חריגה כאשר פועלים עם אוספי List תפסו את החריג שמתרחש בעת הפעלת הקוד: ArrayList<String> list = new ArrayList<String>(); String s = list.get(18); הצג את החריג למסך, ציין את סוגו. |
5 | 5. חריגה כאשר פועלים עם אוספי מפות תפסו את החריג שמתרחש בעת הפעלת הקוד: HashMap<String, String> map = new HashMap<String, String>(null); map.put(null, null); map.remove(null); הצג את החריג למסך, ציין את סוגו. |
7 רישא, איך עובד תפיסה מרובה
- עכשיו, עוד כמה הרצאות מעניינות. אני כל כך אוהב ללמד. - אני רוצה לספר לך איך עובד מלכוד מרובה . למעשה זה מאוד פשוט: כאשר מתרחש חריג ב-block try , ביצוע התוכנית מועבר ל- catch הראשון . - אם הסוג שצוין בסוגריים של ה-block catch זהה לסוג ה-exception-object, אז ביצוע הקוד מתחיל בתוך ה-{}. אחרת נעבור לתפיסה הבאה . הבדיקה חוזרת שם. - אם אין יותר בלוקים לתפוס , אבל החריג לא נתפס, הוא נזרק קדימה, והשיטה הנוכחית נקטעת. - אני רואה. הקאץ' הזה יבוצע, שסוגו תואם את סוג החריגה. - כן נכון. למעשה, זה קצת יותר מסובך: הנקודה היא שהשיעורים יכולים לעבור בירושה אחד מהשני. אם המחלקה «פרה» עוברת בירושה מהמחלקה «חיה», ניתן לאחסן את האובייקט מסוג «פרה» לא רק במשתנה מסוג «פרה», אלא גם במשתנה מסוג «חיה» . - אז מה? - מכיוון שכל החריגים עוברים בירושה ממחלקות Exception או RuntimeException (שהועברו גם בירושה מ- Exception ), ניתן לתפוס את כולם באמצעות פקודות catch (Exception e) או catch (RuntimeException e) . - אז מה? - זה אומר, ראשית, אתה יכול לתפוס כל חריג באמצעות הפקודה catch(Exception e) . שנית, הסדר של בלוקי התפיסה כן משנה. דוגמאות: - ArithmeticException הנובע מחילוק ב-0 נתפס בתפיסה השנייה. - בדוגמה למטה, ArithmeticException נתפס ב- catch הראשון , מכיוון שמחלקות של כל החריגים עוברות בירושה מ-Exception. אז, Exception תופס כל חריג . - בדוגמה למטה, החריג ArithmeticException לא נתפס, אלא נזרק קדימה לשיטת הקריאה. - ובכן, זה הולך ומתבהר עכשיו. חריגים אלה אינם כל כך קלים. - זה רק נראה כך. למעשה, זה אחד הדברים הפשוטים ביותר בג'אווה. - אני בספק אם להיות מרוצה או לכעוס מזה...8 דייגו, משימות תפיסה חריגות מרובות
היי, אמיגו! אתמול השתכרתי וסיבכתי את המשימות שלך, אבל אני מקווה שאין רגשות קשים מצידך ותפתור את כולן? זה לטובתך. כאן:משימות | |
---|---|
1 | 1. חריגים יש שיטה שזורקת שני חריגים שהועברו בירושה מ- Exception , ואת השניים האחרים בירושה מ- RuntimeException : NullPointerException , ArithmeticException , FileNotFoundException ו- URISyntaxException . אתה צריך לתפוס את NullPointerException ו- FileNotFoundException , אבל לא לתפוס את ArithmeticException ו- URISyntaxException . איך לעשות את זה? |
2 | 2. תפיסת חריגים ישנם שלושה חריגים שהועברו ברצף מ- Exception : class Exception1 מרחיב Exception class Exception2 מרחיב Exception1 class Exception3 מרחיב Exception2 יש שיטה, המתוארת כך: public static void method1() זורק Exception1, Exception2, Exception3 כתוב מלכוד חסום כדי לתפוס את כל שלושת החריג1 , החריג2 והחריג 3 |
3 | 3. תפיסת חריגים סלקטיביים 1. גלה אילו חריגים נזרקים על ידי השיטה BEAN.methodThrowExceptions . 2. השיטה processExceptions() צריכה לקרוא למתודה BEAN.methodThrowExceptions ולטפל בחריגים: 2.1. אם מתרחש חריגה של FileSystemException , רשם אותו על ידי קריאה למתודה BEAN.log ושלח קדימה את 2.2. אם מתרחש חריג CharConversionException או כל IOException אחר , פשוט רישום אותו על ידי קריאה למתודה BEAN.log 3. הוסף את המחלקה/סוג של החריג שאתה מעביר ב-2.1. לחתימת שיטת processExceptions() . 4. טפל בחריג שנותר בשיטה main() ורשם אותו. השתמש ב-try..catch טיפ: אם תפסת את החריג MyException , שלא רצית לתפוס אותו, אתה יכול לזרוק אותו קדימה באמצעות הקוד הבא: catch (MyException e) { throw e; } |
4 | 4. תפיסת חריגים מסומנים טפל בכל החריגים המסומנים בשיטה processExceptions() . עליך להציג למסך כל חריג מסומן שהתרחש. אתה יכול להשתמש רק בניסיון בלוק אחד . |
5 | 5. תפיסת חריגים לא מסומנים טפל בכל החריגים הלא מסומנים בשיטה processExceptions() . עליך להציג למסך עקבות מחסנית של כל חריג שהתרחש באמצעות השיטה printStack() . אתה יכול להשתמש רק בניסיון בלוק אחד . |
9 פרופסור, הרצאה על חריגים
- היום יש לנו נושא סופר מעניין - יוצאים מן הכלל. בזמנו, כשמדענים ומתכנתים צעירים התלהבו מאוד מהנושא הזה... - סליחה, אני חייב ללכת למעבדה. להלן הערות הרצאה. אני חושב שאתה תבין את זה בעצמך. כאן: חריגים של Java (תיעוד אורקל) טיפול בחריגים ב-Java (נקודת Java T) Java - טיפול בחריגים (נקודת הדרכה) טיפול בסיסי בחריגים ב-Java10 חוליו
- אמיגו, מה אתה חושב על השיעור של היום? האם המוח הפוזיטרוני שלך עדיין לא הסתדר? המשימות של דייגו מספיקות כדי לשחוק כל אחד. בואו נשתה רגע בירה ונרגע. אתה עדיין עומד?11 קפטן סנאים
– שלום חייל! - בוקר טוב אדוני! - יש לי חדשות מדהימות בשבילך. הנה בדיקה מהירה כדי לחזק את הכישורים שלך. עשה זאת כל יום, ותשפר את הכישורים שלך ממש מהר. משימות תוכננו במיוחד לביצוע ב-Intellij IDEA.משימות נוספות לעשות ב-Intellij Idea | |
---|---|
1 | 1. חלוקה באפס צור שיטה public static void divisionByZero() , שבה אתה צריך לחלק כל מספר באפס, ולהציג למסך את תוצאת החלוקה. עטפו את הקריאה לשיטת divisionByZero() לתוך try..catch . הצג למסך את מחסנית החריגה באמצעות השיטה exception.printStackTrace() . |
2 | 2. ספירה לאחור מ-10 ל-0 כתוב לולאה לספירה לאחור מ-10 ל-0. השתמש ב-Thread.sleep(100) כדי לבצע השהייה; עטפו את שיחת השינה בניסיון..תפוס . |
3 | 3. עטפו שיטה לתוך try..catch קרא מספרים מהמקלדת. כתוב קוד לקריאת מספרים מהמקלדת לתוך שיטה נפרדת readData() . עטפו את כל הגוף של שיטה זו (כל הקוד בתוך שיטת readData() , למעט ההכרזה של הרשימה שבה יאוחסנו המספרים) ב- try..catch . אם המשתמש מזין טקסט כלשהו במקום להזין מספר, השיטה צריכה לתפוס את החריגה ולהציג למסך את כל המספרים שהוזנו קודם לכן. הצג מספרים על המסך. כל מספר צריך להיות בשורה חדשה. סדר המספרים צריך להיות בדיוק כפי שהיה בקלט. |
4 | 4. ממיר תאריך קרא מהמקלדת תאריך בפורמט «18/08/2013» הצג למסך את התאריך הזה בצורה של «18 באוגוסט 2013». השתמש באובייקטים Date ו- SimpleDateFormat . |
5 | 5. תנועות ועיצורים כתוב תוכנית שקוראת שורה מהמקלדת. התוכנית צריכה להציג למסך שתי מחרוזות: 1) המחרוזת הראשונה צריכה להכיל תנועות 2) המחרוזת השנייה צריכה להכיל עיצורים ותווי פיסוק מהטקסט שהוזן. הפרד תווים לפי רווחים. קלט לדוגמה: עצור תראה להקשיב פלט דוגמה: oooie stplklstn |
6 | 6. הסיפור על כיפה אדומה 1. יש חמישה כיתות: כיפה אדומה, סבתא, קציצה, חוטב עצים, זאב. 2. לכל מחלקה יש שני שדות מסוג ArrayList : נהרג ואכל. 3. כבר נוצרו חפצים נחוצים (ברדס, סבתא,...). 4. צור את מערכת היחסים הנכונה (מי אכל והרג את מי) כדי לקבל את ההיגיון של "כיפה אדומה". |
7 | 7. Move static modifies העבר מתקנים סטטיים כך שהקוד יתחבר. |
8 | 8. רשימת מערכי מספרים צור רשימה שהרכיבים שלה הם מערכי מספרים. הוסף לרשימה חמישה מערכי אובייקטים באורך 5, 2, 4, 7, 0, בהתאמה. מלא מערכים בנתונים כלשהם והצג אותם על המסך. |
9 | 9. עשרה חתולים צור חתול בכיתה עם שם מחרוזת שדה . צור מפת מילון <String, Cat> , הוסף 10 חתולים בדגם «שם» - «Cat». קבל מהמפה קבוצת שמות והצג את הסט למסך. |
משימות בונוס | |
---|---|
1 | 1. התוכנית אינה קומפילציה ופועלת. תתקן את זה. משימה: על התוכנית לקרוא מהמקלדת שני שמות קבצים ולהעתיק את הקובץ הראשון למיקום שצוין בשם השני. |
2 | 2. הוסף פונקציונליות חדשה לתוכנית. משימה ישנה: התוכנית צריכה לקרוא מהמקלדת שני שמות קבצים ולהעתיק את הקובץ הראשון למיקום שצוין בשם השני. משימה חדשה: התוכנית צריכה לקרוא מהמקלדת שני שמות קבצים ולהעתיק את הקובץ הראשון למיקום שצוין בשם השני. אם הקובץ (שעומד להיות מועתק) עם השם שצוין לא קיים, התוכנה צריכה להציג למסך את ההודעה «קובץ לא קיים» ולנסות לקרוא את שם הקובץ מהמסוף פעם נוספת לפני קריאת הקובץ שם הקובץ השני (יעד). |
3 | 3. לימוד ותרגול אלגוריתם. קרא מהמקלדת את רשימת המילים והמספרים. הצג למסך מילים בסדר עולה ואת המספרים בסדר יורד. קלט לדוגמה: דובדבן 1 שעועית 3 תפוח 2 0 אבטיח פלט דוגמה: תפוח 3 שעועית 2 דובדבן 1 0 אבטיח |
GO TO FULL VERSION