הבנת ה- NumberFormatException בג'אווה

1. הקדמה

ג'אווה זורק NumberFormatException - חריג לא מסומן - כאשר הוא אינו יכול להמיר חוּט לסוג מספר.

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

במדריך מהיר זה נתאר ונדגים מה גורם ל NumberFormatException בג'אווה ואיך להימנע או להתמודד עם זה.

2. גורם ל NumberFormatException

יש נושאים שונים שגורמים NumberFormatException. למשל, חלק מהבונים והשיטות בג'אווה מביאים את החריג הזה.

נדון ברובם בסעיפים שלמטה.

2.1. נתונים לא מספריים הועברו לבנאי

בואו נסתכל על ניסיון לבנות מספר שלם אוֹ לְהַכפִּיל אובייקט עם נתונים לא מספריים.

שתי ההצהרות הללו יזרקו NumberFormatException:

מספר שלם aIntegerObj = מספר שלם חדש ("אחד"); Double doubleDecimalObj = כפול חדש ("two.2");

בואו נראה את עקבות הערימה שקיבלנו כשהעברנו קלט לא חוקי "אחד" ל- מספר שלם קונסטרוקטור בשורה 1:

חריג בשרשור "ראשי" java.lang.NumberFormatException: למחרוזת קלט: "one" ב- java.lang.NumberFormatException.forInputString (NumberFormatException.java:65) ב- java.lang.Integer.parseInt (Integer.java:580) ב java.lang.Integer. (Integer.java:867) ב- MainClass.main (MainClass.java:11)

זה זרק NumberFormatException. ה מספר שלם קונסטרוקטור נכשל כשניסה להבין קלט באמצעות parseInt () כְּלַפֵּי פְּנִים.

ממשק ה- API של מספר Java אינו מנתח מילים למספרים, כך שנוכל לתקן את הקוד פשוט על ידי שינויו לערך צפוי:

מספר שלם aIntegerObj = מספר שלם חדש ("1"); כפול doubleDecimalObj = כפול חדש ("2.2");

2.2. ניתוח מיתרים המכילים נתונים שאינם מספריים

בדומה לתמיכה של Java בניתוח בבנאי, יש לנו שיטות ניתוח ייעודיות כמו נָקוּבseInt (), parseDouble (), ערך של(), ו לְפַעֲנֵחַ().

אם ננסה לעשות את אותם סוגים של המרה בעזרת אלה:

int aIntPrim = Integer.parseInt ("שניים"); כפול aDoublePrim = Double.parseDouble ("two.two"); מספר שלם aIntObj = Integer.valueOf ("שלוש"); Long decodedLong = Long.decode ("64403L");

ואז נראה אותו סוג של התנהגות שגויה.

ונוכל לתקן אותם בדרכים דומות:

int aIntPrim = Integer.parseInt ("2"); כפול aDoublePrim = Double.parseDouble ("2.2"); מספר שלם aIntObj = Integer.valueOf ("3"); Long decodedLong = Long.decode ("64403");

2.3. העברת מיתרים עם דמויות זרות

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

קצר shortInt = חדש קצר ("2"); int bIntPrim = Integer.parseInt ("_ 6000");

ואז תהיה לנו אותה בעיה כמו בעבר.

נוכל לתקן את זה עם קצת מניפולציה במחרוזות:

קצר shortInt = חדש קצר ("2" .trim ()); int bIntPrim = Integer.parseInt ("_ 6000" .replaceAll ("_", "")); int bIntPrim = Integer.parseInt ("- 6000");

שים לב כאן בשורה 3 ש מספרים שליליים מותרים, באמצעות דמות המקף כסימן מינוס.

2.4. תבניות מספר ספציפיות לאזור

בואו נראה מקרה מיוחד של מספרים ספציפיים למיקום. באזורים אירופיים פסיק עשוי לייצג מקום עשרוני. לדוגמה, "4000,1" עשוי לייצג את המספר העשרוני "4000.1".

כברירת מחדל, נקבל NumberFormatException על ידי ניסיון לנתח ערך המכיל פסיק:

כפול aDoublePrim = Double.parseDouble ("4000,1");

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

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

בואו נראה את זה בפעולה באמצעות אזור עבור צרפת כדוגמה:

NumberFormat numberFormat = NumberFormat.getInstance (Locale.FRANCE); מספר parsedNumber = numberFormat.parse ("4000,1"); assertEquals (4000.1, parsedNumber.doubleValue ()); assertEquals (4000, parsedNumber.intValue ()); 

3. שיטות עבודה מומלצות

בואו נדבר על כמה שיטות עבודה טובות שיכולות לעזור לנו להתמודד NumberFormatException:

  1. אל תנסה להמיר תווים אלפביתיים או מיוחדים למספרים - מספר ה- API של Java אינו יכול לעשות זאת.
  2. אולי נרצה לאמת מחרוזת קלט באמצעות ביטויים רגולריים ולזרוק את החריג עבור התווים הלא חוקיים.
  3. אנו יכולים לחטא קלט כנגד בעיות ידועות צפויות בשיטות כמו מְטוּפָּח() ו החלף הכל().
  4. במקרים מסוימים, תווים מיוחדים בקלט עשויים להיות תקפים. לכן אנו מבצעים עיבוד מיוחד לשם כך מספר פורמט, למשל, התומך במספר פורמטים.

4. מסקנה

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

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

לבסוף ראינו כמה שיטות עבודה מומלצות לטיפול NumberFormatException.

כרגיל, ניתן למצוא את קוד המקור המשמש בדוגמאות ב- GitHub.


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