"זרם כבר הופעל או נסגר" חריג בג'אווה

1. סקירה כללית

במאמר קצר זה נדון במשותף יוצא מן הכלל שאנחנו עשויים להיתקל בהם בעבודה עם ה- זרם בכיתה בג'אווה 8:

IllegalStateException: זרם כבר הופעל או נסגר.

נגלה את התרחישים כאשר חריג זה מתרחש, ואת הדרכים האפשריות להימנע ממנו, לצד דוגמאות מעשיות.

2. הסיבה

ב- Java 8, כל אחד זרם class מייצג רצף נתונים חד פעמי ותומך בכמה פעולות קלט / פלט.

א זרם יש להפעיל (הפעלת פעולת זרם ביניים או מסוף) פעם אחת בלבד. יישום זרם עשוי לזרוק IllegalStateException אם הוא מגלה שה- זרם נעשה שימוש חוזר.

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

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

בואו נראה כיצד ניתן לתרגם זאת לדוגמא מעשית:

Stream stringStream = Stream.of ("A", "B", "C", "D"); Result1 אופציונלי = stringStream.findAny (); System.out.println (result1.get ()); Result2 אופציונלי = stringStream.findFirst ();

כתוצאה:

חריג בשרשור "ראשי" java.lang.IllegalStateException: זרם כבר הופעל או נסגר

לאחר #findAny () השיטה מופעלת, stringStream לכן סגור כל פעולה נוספת במערכת זרם יזרוק את IllegalStateExceptionוזה מה שקרה לאחר הפעלת ה- #findFirst () שיטה.

3. הפיתרון

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

אנחנו יכולים, כמובן, לעשות את זה באופן ידני, אבל שם ספק ממשק פונקציונלי הופך להיות שימושי באמת:

ספק streamSupplier = () -> Stream.of ("A", "B", "C", "D"); תוצאה אופציונלית 1 = streamSupplier.get (). FindAny (); System.out.println (result1.get ()); תוצאה 2 אופציונלית = streamSupplier.get (). FindFirst (); System.out.println (result2.get ());

כתוצאה:

A א

הגדרנו את streamSupplier חפץ עם הסוג זרם, שזה בדיוק אותו סוג שה- #לקבל() השיטה מחזירה. ה ספק מבוסס על ביטוי למבדה שאינו מקבל שום קלט ומחזיר חדש זרם.

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

5. מסקנה

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

תוכל למצוא את קוד המקור השלם ואת כל קטעי הקוד עבור מאמר זה ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found