6 lý do thường gặp gây ra lỗi NumberFormatException

NumberFormatException là một trong những lỗi phổ biến nhất  trong ứng dụng Java cùng với NullPointerException. Lỗi này xảy ra khi bạn cố gắng để chuyển đổi một chuỗi thành một số.Các phương thức chuyển đổi kiểu dữ liệu như Integer.parseInt () , Float.parseFloat () , Double.parseDoulbe () , và Long.parseLong ().Nó sẽ ném ra một ngoại lệ NumberFormatException khi để báo hiệu rằng chuỗi đầu vào không phải là giá trị số.Mặc dù có rất nhiều nguyên nhân,nhưng luôn có đầu vào là một cái gì đó mà không thể được chuyển đổi thành một con số.Hầu hết thời gian tôi đã gặp phải lỗi này là khi chuyển đổi một String sang int hoặc Integer trong Java , nhưng có những trường hợp khác cũng có thể xảy ra lỗi này. Trong bài viết này, tôi chia sẻ 6 lý do phổ biến  dẫn đến lỗi java.lang.NumberFormatException trong các chương trình Java.

6 lý do thường gặp gây ra lỗi NumberFormatException

Thật khó để liệt kê tất cả các lỗi mà JVM ném ra,nhưng tôi đã cố gắng liệt kê các trường hợp thường gặp dẫn đến ngoại lệ NumberFormatException  ở đây. Nếu bạn tìm thấy bất kỳ lý do khác hay gặp lỗi này trong dự án Java của bạn xin vui lòng chia sẻ với chúng tôi thông qua ý kiến comment bài viết.
1. Giá trị Null

String là một đối tượng, một số trường hợp không lấy giá trị được và nó trả về giá null ,phương thức parseInt () khi convert giá trị null sang một số nó sẽ ném ra ngoại lệ NumberFormatException vì null không phải là số.

2. Chuỗi rỗng

Mộ trong những  lý do thường gặp nhất là java.lang.NumberFormatException là một giá trị trống. Nhiều nhà phát triển nghĩ trống trong String là OK và khi sử dụng parseInt () sẽ trả về số không hay một cái gì đó, nhưng điều này không đúng. ParseInt () , hoặc parseFloat () cả hai sẽ ném lỗi NumberFormat như hình dưới đây :

Integer.parseInt("");
Exception in thread "main" java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:504)
at java.lang.Integer.parseInt(Integer.java:527)

3.Chữ và số đầu vào

Khác so với 2 trường họp trên gây ra lỗi  NumberFormatException là đầu vào chữ và số.

Short.parseShort("A1");
Exception in thread "main" java.lang.NumberFormatException: For input string: "A1"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:492)
at java.lang.Short.parseShort(Short.java:117)
at java.lang.Short.parseShort(Short.java:143)

Ở đây các bạn có thể thấy rằng ngay lập tức xảy ra ngoại lệ,”A1″ không phải là sốnhưng bạn nên nhớ rằng A là một số hợp lệ khi bạn chuyển đổi String về một số nguyên trong cơ sở hệ thập lục phân.

4. Khoảng trắng đầu dòng 

Một chuỗi rỗng trăng  ở đầu và đuôi là một trong những lý do chính gay ra lỗi NumberFormatException trong Java, bạn sẽ nghĩ rằng đầu vào chuỗi “123” là Ok nhưng nó không phải. Nó là một khoảng trắng đầu vào.

Long.parseLong(" 123");
Exception in thread "main" java.lang.NumberFormatException: For input string: " 123"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Long.parseLong(Long.java:430)
at java.lang.Long.parseLong(Long.java:483)

Vì vậy, phải đặc biệt chú ý đến ở đầu và đuôi của một chuỗi có khoảng trắng không,trong khi chuyển đổi , nếu có thể sử dụng trim () trước khi đi chuyển đổi String .

5. Vượt quá phạm vi

Một lý do hiếm hoi của java.lang.NumberFormatException là giá trị out-of-range. Ví dụ, nếu bạn cố gắng để chuyển đổi chuỗi “129” sang byte nó sẽ ném NumberFormatException vì tối đa byte là 127. Rõ ràng, 129 là out-of-range cho một biến byte.

Byte.parseByte ( "129" ); 
Ngoại lệ trong chủ đề "chính" java.lang.NumberFormatException: Giá trị ra khỏi phạm vi. Giá trị: "129" Radix: 10 
tại java.lang.Byte.parseByte (Byte.java: 150 )
 tại java.lang.Byte.parseByte (Byte.java: 174 )

6.Ký tự tương tự như một số, ví dụ 1 và l

Có một lần tôi cũng khá bực bội  vì lỗi này,mắt tôi tin rằng đầu vào String là hợp lệ và nghĩ rằng máy tính đã đã bị hỏng 😀 . Chỉ sau vài giờ giờ bạn nhận ra rằng Java là đúng, String đang cố gắng để chuyển đổi thành số không phải là một số “1” thay vì đó là trường hợp L tức là “l” . Bạn có thể thấy nó rất tinh tế và không rõ ràng từ mắt thường, trừ khi bạn đang thực sự chú ý.

Integer.parseInt("l");
Exception in thread "main" java.lang.NumberFormatException: For input string: "l"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:492)
at java.lang.Integer.parseInt(Integer.java:527)

Đó là tất cả các lỗi mà tôi đã liệt kê trên ở từng trường hợp.Khi sử dụng chuyển đổi kiểu dữ liệu String sang một số thường xuyên xảy ra ngoại lệ cho các lập trình viên.Một số trường hợp xảy ra khác thì tùy theo chương trình thông báo lỗi mà chúng ta dựa vào đó để đọc lỗi rồi fix code.

 

x