Memahami NumberFormatException di Java

1. Pengenalan

Java melemparkan NumberFormatException - pengecualian yang tidak dicentang - apabila ia tidak dapat menukar String ke jenis nombor.

Oleh kerana tidak dicentang, Java tidak memaksa kita untuk menangani atau menyatakannya.

Dalam tutorial ringkas ini, kami akan menerangkan dan menunjukkan apa yang menyebabkan NumberFormatException di Java dan bagaimana mengelakkan atau menghadapinya .

2. Punca NumberFormatException

Terdapat pelbagai masalah yang menyebabkan NumberFormatException . Sebagai contoh, beberapa pembangun dan kaedah di Java membuang pengecualian ini.

Kami akan membincangkan kebanyakannya di bahagian di bawah.

2.1. Data Bukan Numerik Diteruskan ke Pembina

Mari kita lihat percubaan untuk membina objek Integer atau Double dengan data bukan angka.

Kedua-dua pernyataan ini akan membuang NumberFormatException :

Integer aIntegerObj = new Integer("one"); Double doubleDecimalObj = new Double("two.2");

Mari kita lihat jejak timbunan yang kita dapat ketika memasukkan input "satu" yang tidak betul kepada pembangun Integer pada baris 1:

Exception in thread "main" java.lang.NumberFormatException: For input string: "one" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:580) at java.lang.Integer.(Integer.java:867) at MainClass.main(MainClass.java:11)

Ia melemparkan NumberFormatException . The Integer pembina gagal ketika cuba untuk memahami input menggunakan parseInt () dalaman.

Java Number API tidak menguraikan kata-kata menjadi angka, jadi kami dapat membetulkan kod dengan hanya mengubahnya menjadi nilai yang diharapkan:

Integer aIntegerObj = new Integer("1"); Double doubleDecimalObj = new Double("2.2");

2.2. Menguraikan Rentetan yang Mengandungi Data Bukan Numerik

Sama seperti sokongan Java untuk menghuraikan konstruktor, kami mempunyai kaedah parse khusus seperti par seInt (), parseDouble (), valueOf () , dan decode () .

Sekiranya kita mencuba dan melakukan penukaran yang sama dengan ini:

int aIntPrim = Integer.parseInt("two"); double aDoublePrim = Double.parseDouble("two.two"); Integer aIntObj = Integer.valueOf("three"); Long decodedLong = Long.decode("64403L");

Kemudian kita akan melihat kelakuan yang salah.

Dan, kita boleh memperbaikinya dengan cara yang serupa:

int aIntPrim = Integer.parseInt("2"); double aDoublePrim = Double.parseDouble("2.2"); Integer aIntObj = Integer.valueOf("3"); Long decodedLong = Long.decode("64403");

2.3. Lulus Rentetan Dengan Watak Ekstrem

Atau, jika kita cuba menukar rentetan ke angka dengan input data yang tidak serupa, seperti ruang kosong atau watak khas:

Short shortInt = new Short("2 "); int bIntPrim = Integer.parseInt("_6000");

Kemudian, kita akan mempunyai masalah yang sama seperti sebelumnya.

Kami dapat membetulkannya dengan sedikit manipulasi tali:

Short shortInt = new Short("2 ".trim()); int bIntPrim = Integer.parseInt("_6000".replaceAll("_", "")); int bIntPrim = Integer.parseInt("-6000");

Perhatikan di sini pada baris 3 bahawa nombor negatif dibenarkan , menggunakan watak tanda hubung sebagai tanda tolak.

2.4. Format Nombor Khusus Lokasi

Mari kita lihat sebilangan besar nombor khas tempatan. Di wilayah Eropah, koma mungkin mewakili tempat perpuluhan. Sebagai contoh, "4000,1" boleh mewakili nombor perpuluhan "4000.1".

Secara lalai, kami akan mendapat NumberFormatException dengan cuba menguraikan nilai yang mengandungi koma:

double aDoublePrim = Double.parseDouble("4000,1");

Kita harus membenarkan koma dan mengelakkan pengecualian dalam kes ini. Untuk mewujudkannya, Java perlu memahami koma di sini sebagai perpuluhan.

Kita boleh membenarkan koma untuk wilayah Eropah dan mengelakkan pengecualian dengan menggunakan NumberFormat .

Mari kita lihat dalam tindakan menggunakan Locale for France sebagai contoh:

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

3. Amalan Terbaik

Mari kita bincangkan beberapa amalan baik yang dapat membantu kita menangani NumberFormatException :

  1. Don't try to convert alphabetic or special characters into numbers – the Java Number API cannot do that.
  2. We may want to validate an input string using regular expressions and throw the exception for the invalid characters.
  3. We can sanitize input against foreseeable known issues with methods like trim() and replaceAll().
  4. In some cases, special characters in input may be valid. So, we do special processing for that, using NumberFormat, for example, which supports numerous formats.

4. Conclusion

In this tutorial, we discussed NumberFormatException in Java and what causes it. Understanding this exception can help us to create more robust applications.

Selanjutnya, kami mempelajari strategi untuk mengelakkan pengecualian dengan beberapa rentetan input yang tidak sah.

Akhirnya, kami melihat beberapa amalan terbaik untuk menangani NumberFormatException .

Seperti biasa, kod sumber yang digunakan dalam contoh boleh didapati di GitHub.