שאלה למתרגלים/למתרגל הסמוי yurib

מנהל: The Architect

נעול
thelegend
הודעות: 95
הצטרף: 21:02 15/12/2008

שאלה למתרגלים/למתרגל הסמוי yurib

שליחה על ידי thelegend » 20:25 19/02/2009

אני מבקש ממכם לכתוב הסבר קצר, אם תרצו "כללי אצבע" על מנת:
1. לזהות מתי צריך לעשות casting
2. איך אני יכול לדעת/לזהות האם כאשר יש שגיאה ודאית האם זו שגיאת קומפילציה או שגיאת זמן ריצה
3.איך יודעים מתי צריך להשתמש/לזרוק/לתפוס exception ואיך יודעים איזה סוג (לתפוס, להעביר הלאה...)

אני יודע שאלה דברים שלומדים באופן כללי בקורס אבל בכל זאת זה ממש יעזור אם תכתבו על זה קצת (קצת על כל נושא) או לפרט בקצרה על כל נושא כמה כללי אצבע.

נ.ב עוד דבר קטן למתרגלים, אם תוכלו לכתוב quiz נוסף לקראת המבחן שמסכם את כל מה שלמדנו (אם אותו סוג של שאלות קטנות ומעצבנות שמלמדות אותנו את הדברים הקטנים שהם בסוף מאוד חשובים)
זה יהיה ממש טוב ומועיל או אם דבר זה לא מתאפשר לתת לנו לינק והרשאה לquiz של שנים עברו

תודה מראש

yurib
הודעות: 207
הצטרף: 18:30 19/11/2008

שליחה על ידי yurib » 23:08 19/02/2009

תודה רבה, זה מאוד נחמד לראות שאתה מעריך את העזרה שלי :) אבל אני רחוק מלהיות מתרגל, המתרגלים שלנו למדו ועבדו קשה מאוד כדי לזכות בתפקיד שלהם, ואילו אני בסה"כ פירסמתי כמה תגובות בפורום. תן למתרגלים את הכבוד המגיע להם, אין צורך להעניק לי תארים שלא הרווחתי.
לגבי השאלות שלך:
1. צריך לעשות casting בכל מקרה שבו אתה משתמש בערך מטיפוס A כשאתה צריך להשתמש בערך מטיפוס B, אם זה בשליחת ארגומנטים לפונקציה, השמה או כל מצב אחר. השאלה היא מתי אפשר לעשות casting ומה נדרש מאיתנו על מנת לעשות זאת. בגדול נחלק ל 2 מקרים: casting ממחלקה יורשת למחלקת על ניתן לבצע ללא חשש. כמו שלמדנו, בין מחלקה יורשת למחלקת על קיים יחס של "Is a" ולכן ניתן להתשמש במחלקה יורשת ספציפית יותר בכל מקום בו נדשת מחלקה כללית ואין צורך אפילו לבצע explicit casting, כלומר להזכיר למהדר שאנחנו רוצים לבצע casting

קוד: בחירת הכל

SuperObject so = (SuperObject)(new SubObject()); // not necessary
SuperObject so1 = new SubObject(); // will do just fine
כיוון שהמהדר יודע לזהות את היחס בין הטיפוסים ולבצע את ההמרה.
casting בכיוון ההפוך הוא קצת יותר בעייתי. איך נדע שהאובייקט אותו אנחנו ממירים הוא אכן סוג של אובייקט היעד? לעשות שימוש בטיפוס כללי כאשר מתבקש טיפוס ספציפי יותר מצריך מאיתנו קודם כל לומר למהדר במפורש שאנחנו מעוניינים לבצע את ההמרה למרות "הסיכון" הכרוך בכך, ובנוסף מוטלת עלינו האחריות לבצע בדיקה שבזמן הריצה האובייקט אותו אנחנו ממירים באמת תואם את הטיפוס הנדרש, כיוון שהמרה מסוג כזה אמנם תעבור קומפילציה אך תזרוק שגיאה בזמן ריצה אם הטיפוסים לא תואמים.
מספר דוגמאות:

קוד: בחירת הכל


public class Box {...}

public class RedBox extends Box {..}

public class GreenBox extends Box {...}

public class Test {

	public static void main(String[] args) {

		Box rbox = new RedBox();
		Box gbox = new GreenBox();
		// compiles and runs since a RedBox/GreenBox, although red/green, is still a box.
		// notice that we didnt have to use the "(CastTarget)castedObject" syntax.

		RedBox redBox = new Box();
		// doesnt compile, because a Box is not a RedBox.

		RedBox redBox1 = (RedBox)(new Box());
		GreenBox greenBox1 = (GreenBox)(new Box());
		// compiles but causes a runtime error, the code is fine, we explicitly
		// announced that we want to cast the object to RedBox/GreenBox but when the program
		// is run, the actual objects we're trying to cast dont meet the requirements.

		RedBox redBox2 = (RedBox)rbox;
		GreenBox greenBox2 = (GreenBox)gbox;
		// compiles and runs, since rbox and gbox, although of type Box, are referencing
		// RedBox and GreenBox objects, respectively.

		RedBox redBox3 = (RedBox)(new GreenBox());
		// doesnt compile, the types just dont match.

	}

}
כל האמור לעיל מתייחס רק לאובייקטים מורכבים ולא למשתנים פרימיטיביים כמובן.

2. המהדר מאוד עוזר לנו אבל בסופו של דבר הוא תוכנית "טיפשה" אם הוא נתקל במשהו שלא נכון מבכינה טכנית, כלומר נסיון לבצע השמה של מחרוזת במשתנה בוליאני, פונקציה שמחזירה ערך שונה ממה שנקבע בחתימה שלה, טעויות תחביר וכו', הוא יתריע לנו ונקבל שגיאת קומפילציה. טעויות לוגיות ומצבים לא צפויים שקורים בזמן אמת אלו דברים שהמהדר לא יודע לזהות ולכן עלולים ליצור שגיאות זמן ריצה.

3. חריגות נפוצות כגון NulllPointerException או ArrayIndexOutOfBoundsException אנחנו כבר מכירים ויודעים מתי לצפות להן, כדי לדעת מתי עלולות להיזרק חריגות אחרות צריך פשוט לצבור נסיון והיכרות עם ה API של ג'אווה. אם אתה משתמש בשיטה כלשהי, תריץ חיפוש זריז בגוגל ותראה אילו חריגות השיטה עלולה לזרוק...

candle of god
הודעות: 15
הצטרף: 21:43 01/12/2008

שליחה על ידי candle of god » 23:28 19/02/2009

אני רחוק מלהיות מתרגל... אין צורך להעניק לי תארים שלא הרווחתי
הוסמכת, סרג'יו... הוסמכת

thelegend
הודעות: 95
הצטרף: 21:02 15/12/2008

תודה רבה

שליחה על ידי thelegend » 12:46 20/02/2009

יורי תודה רבה על התגובה המפורטת
ואם במקרה אחד המתרגלים קורא/רואה את ההודעה הייתי מעוניין גם מחוכמתכם בנושא ובפרט התייחסות לחלק האחרון של ההודעה המקורית (בקשר לquiz)
תודה

thelegend
הודעות: 95
הצטרף: 21:02 15/12/2008

אז מה....

שליחה על ידי thelegend » 15:57 21/02/2009

הלו....?

נעול

חזור אל “- מבוא למדעי המחשב”