PracticU

Handle Dirty Input

בלי כתוביותעם כתוביות
PracticU › קורס יסודות התכנות - שפת JAVA - קורס ג'אווה למתחילים › Handle Dirty Input
Handle Dirty Input
כשקולטים מידע מהמשתמש עלולה להופיע בעיה מסוימת. השיעור מראה מתי היא מופיעה, מה הסיבה לה, ואיך פותרים אותה.
השלבים העיקריים
1. הניסיון הראשון: קולטים שם עם nextLine() ואחר כך גיל עם nextInt(). ההרצה עובדת.
2. הבאג: כשמבקשים קודם את הגיל ואחר כך את השם, התוכנית מציגה את שאלת השם ומדפיסה שם ריק מיד, בלי שהמשתמש הזין שם.
3. הסיבה: nextInt() לוקח מהתור רק את המספר, ואת ה-Enter משאיר בתור הקלט. ה-nextLine() הבא קורא את ה-Enter הזה כסוף שורה ריקה.
4. הפתרון: מוסיפים console.nextLine() מיד אחרי קליטת המספר. השורה הזו מנקה את ה-Enter שנשאר בתור.
5. מתי נדרש הניקוי: רק כשקולטים מספר ואחריו מחרוזת. אם קולטים כמה מספרים ברצף, אין צורך בניקוי, כי nextInt() לוקח רק את המספרים.
שימו לב
בלי הניקוי הקלט הישן נשאר בתור ומשפיע על כל קריאה הבאה. לכן הקלט נקרא מלוכלך (Dirty Input).
אחרי הניקוי אפשר לקלוט מספר ואחריו מחרוזת בלי בעיה.
השיעור הבא בקורס: Avoid Mismatch Input
מילון מושגים:
באג – תקלה או שגיאה בקוד שגורמת לתוכנה להתנהג בניגוד למצופה.
מחרוזת – סוג נתונים שמייצג רצף של תווים, כלומר טקסט, ומשמש לאחסון מילים, משפטים או כל רצף סימנים.

פרקי ההרצאה: Handle Dirty Input

  1. 00:00

    קליטת שם וגיל מהמשתמש בקונסול

  2. 00:41

    הנחיות למשתמש לפני קליטת הגיל

  3. 01:47

    שינוי סדר הקלט ותקלה בקליטת השם

  4. 02:21

    הקונסול מדלג על קליטת השם

  5. 03:02

    הסבר על מה קורה בקלט מחרוזת

  6. 03:58

    תור הקלט Input Queue

  7. 04:56

    nextLine אוספת גם את ה-Enter

  8. 05:56

    nextInt משאיר Enter בתור הקלט

תמלול ההרצאה: Handle Dirty Input

הטקסט המלא של הדקות הראשונות בהרצאה «Handle Dirty Input» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

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

  2. 00:15

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

  3. 00:34

    מה שאני רוצה לעשות זה קודם כל לקלוט מהמשתמש את השם שלו ואז את הגיל שלו. יש לנו פה את הקונסול ואנחנו פותחים פה string name שווה console.nextline כמו שראינו.

  4. 00:51

    כדאי לפני זה לומר ליוזר please enter your name. נוריד כאן את ה-ln ומיד אחר כך נאמר ליוזר Please enter your age, נוריד את ה-ln שהכל יהיה באותה השורה, ניקח integer age ונבצע console.next int בצורה כזאת.

  5. 01:22

    בסיום יש לנו סגירה, אבל כמובן בואו נראה שהמידע הגיע כמו שצריך. Your name is, הנה ה-name שלו, ו-your age is, והנה ה-age של היוזר.

  6. 01:42

    בואו נריץ ונעביר שליטה לקונסול. Please enter your name. מוישה, enter. Please enter your age. אני פשוט רושם 20. Enter.

  7. 01:57

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

  8. 02:06

    והצ'יינג' שאנחנו רוצים לעשות זה קודם קודם כל לבקש מהמשתמש את הגיל שלו, זה כל מה שרצינו לעשות. קודם כל תביא לי את הגיל, מותר לי, אני לא חייב קודם כל את ה-Name, ואחר כך את ה-Name.

  9. 02:24

    בואו נריץ את זה, אנחנו רואים Please Enter Your Age, יוזר מכניס 20, Enter, ושימו לב מה קרה, יש פה איזשהו באג.

  10. 02:37

    מיד אנחנו רואים Please Enter Your Name, שזה בסדר, אבל הקונסול לא המתין שנכניס את ה-Name אלא השורה הזאת שמבקשת את ה-Name מיד המשיכה הלאה, לא החזירה לנו כלום בעצם ומיד אני רואה Your Name is שזה זה כלום ו-Your Age is 20.

  11. 03:02

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

  12. 03:29

    כאשר אנחנו מריצים את התוכנית ואנחנו רוצים לקלוט מחרוזת, בואו נריץ אותה, אז היוזר מכניס מחרוזת, מוישה, אבל אנחנו לא רואים שהתוכנית ממשיכה.

  13. 03:43

    למה היא לא ממשיכה? כמובן כי היא ממתינה ל-Enter. אבל איפה התוכנית כרגע תקועה? התוכנית תקועה ב-Console Next Line הזאת, בפקודה הזאת, והיא ממתינה שהיוזר יכניס Enter.

  14. 03:58

    אבל איפה כל המידע הזה נכנס? אז המידע בעצם ממתין במקום שנקרא The Input Queue, שזה בעברית תור הקלט. יש בעצם איזשהו מקום שקולט את כל המידע מהמקלדת, בואו נניח שזה המקום הזה, ואם היוזר הכניס מוישה כל התווים האלה פשוט ממתינים שם שמישהו יאסוף אותם ורק אם היוזר יכניס אנטר,

  15. 04:32

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

  16. 04:56

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

  17. 05:17

    כלום, שום דבר, מפני ש-next line הצליחה לנקות את כל המידע כולל האנטר הסופי. ואז מגיע next int, user מכניס 20, לוחץ על enter ו-next int לקחה את ה-20 אבל לא לקחה את ה-enter הסופי שזה בסדר ומכניסה אותו ל-age אבל אם אנחנו הופכים את זה אז משהו אחר קרה כאן.

  18. 05:56

    בואו רגע נעצור נריץ ואנחנו רואים שקודם כל אנחנו רוצים לקלוט את ה-age. user מכניס 20 לוחץ enter בסוף next int לוקחת רק את ה-20 מפני שנקסט אינט לא יכולה לקחת אנטר כי אנטר זה לא מספר.

  19. 06:21

    אז אם היא לקחה רק את ה-20 שימו לב מה נשאר בתור הקלט. נשאר שם איזשהו תו של אנטר שלא רואים אותו

לקורס המלא: קורס ג'אווה למתחילים אונליין

ההרצאה הקודמת: Numeric Input

ההרצאה הבאה: Avoid Mismatch Input

הרצאות קשורות מקורסים אחרים

  • קלט מהמשתמש - User Input

קורסים נוספים במסלול

  • קורס מבוא ל-QA - מידע חשוב לבודק תוכנה
  • קורס פוסטמן - Postman - בדיקות לאתרי אינטרנט - API
  • קורס Robot Framework - בדיקות QA ממשק גרפי
  • קורס סלניום בסיסי - בדיקות אוטומטיות - Selenium
  • קורס סלניום מתקדם - CI/CD - Continues Integration
  • קורס מייבן - Maven